Создать SortedMap с Custom Compartor - PullRequest
0 голосов
/ 17 февраля 2020

Я пробовал несколько вещей, которые появляются 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)
...