У меня есть карта строковых ключей и значений int, я сортирую их и сохраняю их отсортированными при изменении значений. Я попробовал использовать treemap для отсортированных пар и нормальную карту для несортированного париса, чтобы я мог использовать его в компараторе, но после того, как одно значение передается другим, я получаю нулевое исчисление, это дефиниция:Как я могу получить treeMap, который сортируется по значению, сохраняя сортировку при изменении элементов?
public static TreeMap<String, Long> countryData;
public static ValueComparator bvc;
public static void setCountryData(HashMap<String, Long> map){
bvc = new ValueComparator(map);
countryData = new TreeMap<String, Long>(bvc);
countryData.putAll(map);
System.out.println(Arrays.toString(countyNames));
System.out.println(countryData.values());
}
public static class ValueComparator implements Comparator<String> {
Map<String, Long> base;
public ValueComparator(Map<String, Long> base) {
this.base = base;
}
public int compare(String a, String b) {
if(base.get(a).equals(base.get(b))){
return 0;
}
if (base.get(a) > base.get(b)) {
return -1;
} else {
return 1;
}
}
}
это то, как я могу изменить значение:
General.bvc.base.put(country, newValue);
General.countryData.put(country, newValue);
после одного значения проходит другой, и я пытаюсь Acces его, я получаю нуль, как я могу это сделать?
, но я сделал собственный компаратор для сравнения значений. Если это неправильный путь, каков правильный путь? – Yovboy
Если ваш пользовательский компаратор не возвращает заказ на клавиши, «TreeMap» не может работать. Это является нарушением контракта. Кроме того, обновление того, что используется в качестве ключа, также является нарушением контракта. Вы не можете этого сделать. – EJP
Согласен. Невозможно написать реализацию карты, отсортированную по значению, которое действительно работает. Вы можете сохранить нормальную карту, а затем сортировать ее по значению каждый раз, когда вы перебираете ее, но это примерно так же хорошо, как вы можете получить. –