Java TreeMap Comparator
Мне нужен компаратор для TreeMap. Должен ли я написать это анонимно в конструкторе для моего TreeMap? Как еще я мог написать свой компаратор. В настоящее время Java не нравится мой код (могу ли я сделать это анонимно?):
SortedMap<String, Double> myMap =
new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
{
public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
{
return o1.getValue().compareTo(o2.getValue());
}
});
- Могу ли я сделать вышеуказанное анонимно?
- Как еще я мог это сделать?
- Я хочу отсортировать myMap по значению, а не по ключу
3 ответа
Вы не можете сортировать TreeMap по значениям.
Реализация NavigableMap на основе красно-черного дерева. Карта сортируется в соответствии с естественным порядком ее ключей или с помощью компаратора, предоставляемого во время создания карты, в зависимости от того, какой конструктор используется. Вам нужно будет предоставить
comparator
заComparator<? super K>
так что ваш компаратор должен сравнивать по ключам.
Чтобы обеспечить сортировку значений, вам понадобится SortedSet. использование
SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Map.Entry<String, Double> e1,
Map.Entry<String, Double> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
sortedset.addAll(myMap.entrySet());
Чтобы дать вам пример
SortedMap<String, Double> myMap = new TreeMap<String, Double>();
myMap.put("a", 10.0);
myMap.put("b", 9.0);
myMap.put("c", 11.0);
myMap.put("d", 2.0);
sortedset.addAll(myMap.entrySet());
System.out.println(sortedset);
Выход:
[d=2.0, b=9.0, a=10.0, c=11.0]
Компаратор должен быть только для ключа, а не для всей записи. Сортирует записи по ключам.
Вы должны изменить это на что-то следующее
SortedMap<String, Double> myMap =
new TreeMap<String, Double>(new Comparator<String>()
{
public int compare(String o1, String o2)
{
return o1.compareTo(o2);
}
});
Обновить
Вы можете сделать что-то следующим образом (создать список записей на карте и отсортировать список по значению, но учтите, что сортировка самой карты не производится) -
List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
Вы можете провести ключ и значение. Например
String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"};
int[] v = {341, 273, 278, 329, 445};
TreeMap<Integer,String>a=new TreeMap();
for (int i = 0; i < k.length; i++)
a.put(v[i],k[i]);
System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());
a.remove(a.firstEntry().getKey());
System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());