Я пробовал несколько вещей, которые появляются TreeMap
поддерживает только сортировку по ключам. Я попытался обойти его с помощью кода, который нашел в Интернете, но он выдал ошибку StackOverflowError
. Зачем мне нужна возможность сравнения на Map.Entry
конкретно. Один - сравнивать по значениям, другой - сравнивать значения с помощью специального компаратора, такого как тасование или обратный порядок.
Также предполагается, что при построении этой карты любой объект, добавленный в отсортированную карту, будет использовать компаратор каждый раз. время это добавляется. В интерактивных руководствах используется LinkedHashMap
и преобразование в массив, а затем он застревает в указанном порядке, добавляя что-либо к этому объекту, не сохраняя порядок компаратора
public static <K, V> SortedMap<K, V> sort(Map<K, V> map, Comparator c)
{
TreeMap<K, V> ordered = new TreeMap<K, V>(c);
if(c instanceof ComparatorValue)
((ComparatorValue)c).map = ordered;
ordered.putAll(map);
return ordered;
}
класс компаратора
public SortedMap map;
public ComparatorValue(SortedMap instance)
{
this.map = instance;
}
@Override
public int compare(Object key1, Object key2)
{
Comparable val1 = (Comparable) this.map.get(key1);
Comparable val2 = (Comparable) this.map.get(key2);
if(val1 == val2)
return 1;
return val1.compareTo(val2);
}
код ошибки
Exception in thread "main" java.lang.StackOverflowError
at java.util.TreeMap.getEntryUsingComparator(Unknown Source)
at java.util.TreeMap.getEntry(Unknown Source)
at java.util.TreeMap.get(Unknown Source)
at jml.evilnotch.lib.simple.ComparatorValue.compare(ComparatorValue.java:17)