Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем LaoTheLizard, 8 апр 2015.

  1. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Написал такую процедуру:
    Код:
        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[] успешно отсортированы по возрастанию. Однако на выходе получаю таблицу в прежнем виде. В чём дело?
     
  2. Хостинг MineCraft
    <
  3. LomNar

    LomNar Активный участник Пользователь

    Баллы:
    78
    Skype:
    radius981
    Имя в Minecraft:
    LomNar
    Сам плохо работаю с HashMap, может это
     
  4. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    HashMap и HashSet не имеют порядка.
    Можно использовать LinkedHashMap, чтобы при итерации элементы возвращались в порядке вставки.
    Ещё вариант — копировать ключи в ArrayList, затем применять к нему Collections.sort(), и затем итерировать ключи по нему.

    Справочник по Java Collections Framework
     
  5. LomNar

    LomNar Активный участник Пользователь

    Баллы:
    78
    Skype:
    radius981
    Имя в Minecraft:
    LomNar
    Вот: (не моё)
    Код:
    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);
    
     
  6. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Использовать linked - самое простое решение.
     
  7. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Код:
    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;
    }
     
  8. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

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

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Для начала изучите как работает тот же хешмап изнутри, чтобы не было таких вопросов)
     

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