Я хочу отсортировать Java TreeMap на основе некоторого атрибута значения. Чтобы быть конкретным, я хочу отсортировать TreeMap<Integer, Hashset<Integer>>
на основе размера Hashset<Integer>
. Для этого я сделал следующее:
A Класс компаратора:
private static class ValueComparer implements Comparator<Integer> {
private Map<Integer, HashSet<Integer>> map = null;
public ValueComparer (Map<Integer, HashSet<Integer>> map){
super();
this.map = map;
}
@Override
public int compare(Integer o1, Integer o2) {
HashSet<Integer> h1 = map.get(o1);
HashSet<Integer> h2 = map.get(o2);
int compare = h2.size().compareTo(h1.size());
if (compare == 0 && o1!=o2){
return -1;
}
else {
return compare;
}
}
}
Пример использования:
TreeMap<Integer, HashSet<Integer>> originalMap = new TreeMap<Integer, HashSet<Integer>>();
//load keys and values into map
ValueComparer comp = new ValueComparer(originalMap);
TreeMap<Integer, HashSet<Integer>> sortedMap = new TreeMap<Integer, HashSet<Integer>>(comp);
sortedMap.putAll(originalMap);
Проблема:
Это не работает, если originalMap
содержит более 2 значений одинакового размера. В других случаях все работает нормально. Когда более двух значений на карте имеют одинаковый размер, третье значение в новой отсортированной карте равно нулю и выдает исключение NullPointerException, когда я пытаюсь получить к нему доступ.
Я не могу понять, в чем проблема. Хорошо, если кто-то укажет.
Обновление:
Вот пример, который работает, когда два значения имеют одинаковый размер: http://ideone.com/iFD9c
В приведенном выше примере, если вы раскомментируете строки 52-54, этот код потерпит неудачу - вот в чем моя проблема.