Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Сортировка HashMap [РЕШЕНО]

LaoTheLizard

Старожил
Пользователь
Баллы
103
Написал такую процедуру:
Java:
    private Map<String, Integer> sortUp(Map<String, Integer> villagesUnsorted) {       
        int size = villagesUnsorted.size();
        String[] village = new String[size];
        int[] distance = new int[size];
        int i = 0;

        for (Map.Entry<String, Integer> mapEntry : villagesUnsorted.entrySet()) {
            village[i] = mapEntry.getKey();
            distance[i] = mapEntry.getValue();
           i++;
        }
       
        for(i = distance.length - 1 ; i > 0 ; i--){
            for(int j = 0 ; j < i ; j++){  
                if( distance[j] > distance[j+1]){
                    int tmp = distance[j];        String stmp = village[j];
                    distance[j] = distance[j + 1];    village[j] = village [j+1];
                    distance[j + 1] = tmp;        village[j + 1] = stmp;
                }
            }
        }
        Map<String, Integer> sorted = new HashMap<String, Integer>();
       
        for(int j = 0; j < size; j++){
            sorted.put(village[j], distance[j]);
        }
        return sorted;
    }

Опытным путем установил, что village[] и distance[] успешно отсортированы по возрастанию. Однако на выходе получаю таблицу в прежнем виде. В чём дело?
 
Сам плохо работаю с HashMap, может это
 
HashMap и HashSet не имеют порядка.
Можно использовать LinkedHashMap, чтобы при итерации элементы возвращались в порядке вставки.
Ещё вариант — копировать ключи в ArrayList, затем применять к нему Collections.sort(), и затем итерировать ключи по нему.

Справочник по Java Collections Framework
 
Вот: (не моё)
Java:
final Map<String,Integer> map =newHashMap<>();
map.put("C",7);
map.put("B",3);
map.put("A",5);

final Map<String,Integer> sortedMap =newTreeMap<>(newComparator<String>(){@Overridepublicint compare(String lhs,String rhs){return map.get(lhs).compareTo(map.get(rhs));}});
sortedMap.putAll(map);
 
Java:
private Map<String, Integer> sortVillages(Map<String, Integer> villagesUnsorted)
{
    final Map<String, Integer> result = new LinkedHashMap<>();
    final ArrayList<String> keys = new ArrayList<>(villagesUnsorted.keySet());
    Collections.sort(keys);
    for(String key : keys)
        result.put(key, villagesUnsorted.get(key));
    return result;
}
 
Много ответов, всем спасибо, всё пробовать лень, так как цели уже достиг. Не без вашей помощи достиг. Все решилось изменением одной строки согласно вашим рекомендациям. Она теперь выглядит так:
Java:
Map<String, Integer> sorted = new LinkedHashMap<String, Integer>();

Да, все-таки хочу выразить свое удивление. Я создаю новый список. Добавляю в него элементы в некотором порядке, а они падают в него в другом порядке. В том, в котором они лежали в другом списке, откуда я их сначала вывел в массивы, потом в массивах отсортировал, а уже потом из этих массивов добавил. Получается, что элементы оставили за собой номера из старого HashMap. :confused:
 
Много ответов, всем спасибо, всё пробовать лень, так как цели уже достиг. Не без вашей помощи достиг. Все решилось изменением одной строки согласно вашим рекомендациям. Она теперь выглядит так:
Java:
Map<String, Integer> sorted = new LinkedHashMap<String, Integer>();

Да, все-таки хочу выразить свое удивление. Я создаю новый список. Добавляю в него элементы в некотором порядке, а они падают в него в другом порядке. В том, в котором они лежали в другом списке, откуда я их сначала вывел в массивы, потом в массивах отсортировал, а уже потом из этих массивов добавил. Получается, что элементы оставили за собой номера из старого HashMap. :confused:
Для начала изучите как работает тот же хешмап изнутри, чтобы не было таких вопросов)
 

Поделиться этой страницей

Назад
Верх