Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Сортировка Hashmap и вывод верхнего ключа


Автор: sourceman 04.04.16, 20:55
Всем привет, по всей видимости проблема легкая, но не могу найти решения

есть

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    HashMap<Integer, Integer> hm = new HashMap<>();


значения сортируются в нем следующим методом


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        public static <K, V extends Comparable<? super V>> Map<K, V>
        sortByValue( Map<K, V> map ) {
            Map<K,V> result = new LinkedHashMap<>();
            Stream <Entry<K,V>> st = map.entrySet().stream();
            st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e ->result.put(e.getKey(),e.getValue()));
            
         return result;
        }


и затем мне нужно получить последний ключ, т.е. просто его вывести, но знаний не хватает,

hm всегда вмещает 100 значений, т.е. мне нужен последний сотый ключ, нужно что-то типа
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    System.out.println(hm.get(100));


Поправьте мои бредни пожалуйста

Автор: MBo 05.04.16, 02:29
Если понадобилось сравнивать элементы на больше-меньше, и сортировать, значит Hashmap - неудачный выбор структуры данных.

Автор: sourceman 05.04.16, 06:27
TreeMap тогда использовать?

Объясню задачу, есть 100 пар ключ-значение, они кладутся в TreeMap(не важно, можно другой тип данных),

key=value
1=30
2=20
3=50
4=80
5=70
....

Мне нужно отсортировать по значению, т.е. самое большое значение 70 должно быть сверху и распечатать его

Автор: MBo 05.04.16, 06:52
Для задачи - узнать или извлечь макс/мин значение - предназначена очередь по приоритетам (Priority Queue).
Она может быть создана на основе TreeMap, но, вероятно, в джаве есть готовая PriorityQueue

(TreeMap несколько медленнее, т.к. оно поддерживает более сильную упорядоченность)

Автор: sourceman 10.04.16, 09:16
В общем обошелся без сортировки, просто получая доступ напрямую к элементу, аля

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Map<Integer, Integer> mL1 = new LinkedHashMap<>();
    Object firstKey = mL1 .keySet().toArray()[mL1.size()-1];


Не красиво наверное, но работает :)

Автор: MBo 10.04.16, 10:03
А как hashmap этот набор данных вообще используется?

Автор: VisualProg 14.04.16, 06:16
Очевидно вы вообще неправильно поставили задачу... Map нужен не для хранения пары ключ-значение, а для доступа к значению по ключу. Вашу задачу, имхо, правильнее было решать списком, элементы которого будут ваши Pair экземпляры.


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    public class MyIntPair {
     
        private int name;
        private int value;
     
        
        public MyIntPair(int name, int value){
            this.name=name;
            this.value=value;
        }
        
        public int getName(){
            return name;
        }
        
        public int getValue(){
            return value;
        }
     
    }



Далее обычный List:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    List<MyIntPair> list = new ArrayList<MyIntPair>();
    ...
     
    Collections.sort(list,new Comparator<MyIntPair>() {
                        @Override
                        public int compare(MyIntPair o1, MyIntPair o2) {
                            return o1.getValue()-o2.getValue();
                        }
            });


а далее как и хотел:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int yourValue = list.get(list.size()-1).getValue();


Добавлено
Цитата
hm всегда вмещает 100 значений,

о_О тоесть? Хотите сказать что в него нельзя запихнуть 700 элементов? Или вы про размер страницы? Если это размер страницы, зачем вам:
Цитата
т.е. мне нужен последний сотый ключ

?

Добавлено
Цитата
Не красиво наверное, но работает

Повторюсь, вы изначально неверно поставили задачу, решив что нужно использовать Map.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)