Подтвердить что ты не робот

Компилятор Java TreeMap

Мне нужен компаратор для TreeMap. Должен ли я писать это анонимно в конструкторе для моего TreeMap? Как еще я мог написать свой компаратор. В настоящее время Java не нравится мой код (могу ли я сделать это анонимно?):

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
    {
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
        {
            return o1.getValue().compareTo(o2.getValue());
        } 
    });
  • Могу ли я сделать анонимно выше?
  • Как еще я могу это сделать?
  • Я хочу сортировать myMap по значению, а не по ключу.
4b9b3361

Ответ 1

Вы не можете сортировать TreeMap значения.

Реализация NavigableMap на основе Red-Black. Карта сортируется в соответствии с естественным порядком ее ключей или компаратором, предусмотренным на момент создания карты, в зависимости от того, какой конструктор используется Вам нужно будет предоставить comparator для Comparator<? super K>, чтобы ваш компаратор сравнил ключи.

Чтобы обеспечить сортировку по значениям, вам понадобится SortedSet. Используйте

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
            new Comparator<Map.Entry<String, Double>>() {
                @Override
                public int compare(Map.Entry<String, Double> e1,
                        Map.Entry<String, Double> e2) {
                    return e1.getValue().compareTo(e2.getValue());
                }
            });

  sortedset.addAll(myMap.entrySet());

Чтобы дать вам пример

    SortedMap<String, Double> myMap = new TreeMap<String, Double>();
    myMap.put("a", 10.0);
    myMap.put("b", 9.0);
    myMap.put("c", 11.0);
    myMap.put("d", 2.0);
    sortedset.addAll(myMap.entrySet());
    System.out.println(sortedset);

Вывод:

  [d=2.0, b=9.0, a=10.0, c=11.0]

Ответ 2

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

Вы должны изменить его на что-то следующим образом

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>()
    {
        public int compare(String o1, String o2)
        {
            return o1.compareTo(o2);
        } 
});

Обновление

Вы можете сделать что-то следующим образом (создать список записей на карте и отсортировать базу списка по значению, но обратите внимание, что это не будет сортировка самой карты) -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    });

Ответ 3

вы можете прокручивать ключ и значение. Например

        String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"};
        int[] v = {341, 273, 278, 329, 445};
        TreeMap<Integer,String>a=new TreeMap();
        for (int i = 0; i < k.length; i++) 
           a.put(v[i],k[i]);            
        System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());
        a.remove(a.firstEntry().getKey());
        System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());