2015-03-06 5 views
1

Надеюсь, у вас все хорошо. У меня возникают проблемы с реализацией метода компаратора для сортировки карты по ее значениям. Я написал метод компаратора, и теперь я пытаюсь написать метод, который принимает несортированную карту в качестве входных данных, и использует реализацию компаратора для возврата отсортированного Map. Однако в одной из строк моего кода есть ошибка, которая мешает ему компилировать. Код для метода сортировки я писал приведен ниже:Компаратор для сортировки карты

public static HashMap<String,ArrayList<String>>strongSorter(HashMap<String,ArrayList<String>> unsortedMap) { 

    MapComparator myCompare = new MapComparator(unsortedMap); 
    HashMap<String,ArrayList<String>> sortedMap = new HashMap<String,ArrayList<String>>(myCompare); 
    sortedMap.putAll(unsortedMap); 
    return sortedMap; 
} 

ошибка присутствует в строке, где я стараюсь и создать свой SortedMap; Eclipse заявляет, что мне не разрешено передавать myCompare в качестве аргумента, поскольку мои введенные аргументы должны соответствовать входам в HashMap<String, ArrayList<String>>. Я не знаю, как обойти это и по-настоящему оценить любую помощь.

Спасибо!

+2

Сортировка a ... HashMap? – Rogue

ответ

3

Вы не можете отсортировать HashMap. Из Javadoc (основное внимание):

Реализация интерфейса карты на основе хэш-таблицы. Эта реализация предоставляет все необязательные операции с картами, а допускает нулевые значения и нулевой ключ. (Класс HashMap примерно равен , эквивалентный Hashtable, за исключением того, что он несинхронизирован и разрешает nulls.) Этот класс не дает никаких гарантий относительно порядка карты; , в частности, он не гарантирует, что заказ останется постоянным с течением времени.

Если вы хотите заказ на вашей карте, вы должны использовать SortedMap, такие как TreeMap. Также обратите внимание, что TreepMap сортирует ключи, поэтому вам может потребоваться try another approach to this.

Вы можете сделать это на Java 8 с помощью метода comparingByValue() в Map.Entry. Вот пример, который возвращает Stream отсортированных по значениям карт:

public static Stream<Map.Entry<String, List<String>>> strongSorter(Map<String, List<String>> unsortedMap) { 
    return unsortedMap.entrySet() 
         .stream() 
         .sorted(Map.Entry.comparingByValue(new MapComparator())); 
} 
0

Вы можете использовать TreeMap в отсортированный карте и указать компаратор.