Как отсортировать LinkedHashMap по полю класса значения?
-
12-09-2019 - |
Вопрос
Я использую следующие строки для сортировки LinkedHashMap, но не все элементы отсортированы, что-то не так?
LinkedHashMap<String,PatternData> statisticsMap;
// fill in the map ...
LinkedHashMap<String,PatternData> sortedStatisticsMap=new LinkedHashMap<String,PatternData>(); // Sort it by patternData's average
ArrayList<PatternData> statisticsMapValues=new ArrayList<PatternData>(statisticsMap.values());
Collections.sort(statisticsMapValues,Collections.reverseOrder()); // Sorting it (in reverse order)
patternData last_i=null;
for (PatternData i : statisticsMapValues) // Now, for each value
{
if (last_i==i) continue; // Without dublicates
last_i=i;
for (String s : statisticsMap.keySet()) // Get all hash keys
if (statisticsMap.get(s)==i) // Which have this value
{
sortedStatisticsMap.put(s,i);
}
}
class PatternData implements Comparable<PatternData>
{
float sum=0,average;
int totalCount=0;
Vector<String> records=new Vector<String>();
public PatternData() { }
public void add(float data)
{
sum+=data;
totalCount++;
average=sum/totalCount;
}
public void add(float data,String record)
{
add(data);
records.add(record);
}
float getAverage() { return average; }
public int compareTo(patternData o) { return (int)(average-o.average); }
}
Решение
Когда вы возвращаете int, диапазон, когда среднее значение находится между -1 и 1, всегда будет возвращать 0.
Одним из решений является просто изменить функцию CompareTo на:
return Float.compare(average, o.average);
Другие советы
Вы сортируете числа с плавающей запятой, используя целые числа.Целые числа не округляются;они усекаются.Кроме того, учитывая то, как вы на самом деле выполняете сортировку, рассмотрите возможность использования вместо этого TreeHashMap.
(и просто для придирок, соглашение Java использует строчные буквы для имен методов и переменных)
Не связан с StackOverflow