Сортировка карты <Key, Value> в порядке убывания в зависимости от значения
Возможный дубликат:
Как сортировать карту < Key, Value > по значениям в Java?
Я использую интерфейс карты для чтения из файла, а затем сохраняю значения в качестве пары значений ключа. Формат файла выглядит следующим образом
A 34
B 25
c 50
Я прочитаю данные из этого файла и сохраню это как пару ключевых значений, а затем я покажу это пользователю. Мое требование - отображать результаты в этом формате
C 50
A 34
B 25
Таким образом, мне нужно отсортировать карту в порядке убывания значения. Так что я смогу отобразить их в качестве результата. Я прочитал об этом и найду ниже код
static <K,V extends Comparable<? super V>> SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
new Comparator<Map.Entry<K,V>>() {
@Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
int res = e1.getValue().compareTo(e2.getValue());
return res != 0 ? res : 1; // Special fix to preserve items with equal values
}
}
);
sortedEntries.addAll(map.entrySet());
return sortedEntries;
}
Я надеюсь, что это отсортирует значения в порядке возрастания, я просто хочу знать, правильный ли этот подход или какой-то другой эффективный подход будет полезен для меня?
Ответы
Ответ 1
Поскольку вы можете иметь повторяющиеся значения, вы не должны использовать Set
вообще. Перейдите к List
и сортируйте его. Ваш entriesSortedByValues
будет выглядеть примерно так:
static <K,V extends Comparable<? super V>>
List<Entry<K, V>> entriesSortedByValues(Map<K,V> map) {
List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());
Collections.sort(sortedEntries,
new Comparator<Entry<K,V>>() {
@Override
public int compare(Entry<K,V> e1, Entry<K,V> e2) {
return e2.getValue().compareTo(e1.getValue());
}
}
);
return sortedEntries;
}
Примечание: в вашем примере выведите значения спуска. Если вы хотите, чтобы они восходили, используйте e1.getValue().compareTo(e2.getValue())
вместо этого.
Пример:
public static void main(String args[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 34);
map.put("B", 25);
map.put("C", 50);
map.put("D", 50); // "duplicate" value
System.out.println(entriesSortedByValues(map));
}
Вывод:
[D=50, C=50, A=34, B=25]
Ответ 2
Напишите свой собственный comparator
и передайте его TreeMap
class MyComparator implements Comparator {
Map map;
public MyComparator(Map map) {
this.map = map;
}
public int compare(Object o1, Object o2) {
return ((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
}
}
В тестовом классе
Map<String, Integer> lMap=new HashMap<String, Integer>();
lMap.put("A", 35);
lMap.put("B", 25);
lMap.put("C", 50);
MyComparator comp=new MyComparator(lMap);
Map<String,Integer> newMap = new TreeMap(comp);
newMap.putAll(lMap);
Вывод:
C=50
A=35
B=25