2016-01-16 2 views
-1

Я прочитал о списке сортировки в алфавитном порядке, такие как: Hashmap sorting, Sorting MapsСортировать разделы Карты по алфавиту

У меня есть Map<String, Integer> со значениями, такими как

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zoopies, 2 
Zappin, 2 
Chapas, 1 
Zong Zwing, 1 
Chingos, 1 
Chapis, 1 
Grouches, 0 

мне нужно (ТОЛЬКО) сортировать разделы, которые имеют одинаковые точки в алфавитном порядке. Это пример данных, поэтому не будет знать, что фактические значения в Карте поэтому должны сортироваться на основе любых значений. Я уже сгруппированы/отсортированы по значениям с помощью:

public <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
     Comparator<K> valueComparator = new Comparator<K>() { 
      public int compare(K k1, K k2) { 
       int compare = map.get(k2).compareTo(map.get(k1)); 
       if (compare == 0) { 
        return 1; 
       } else { 
        return compare; 
       } 
      } 
     }; 
     Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
     sortedByValues.putAll(map); 
     return sortedByValues; 
    } 

Это ожидаемый результат:

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zappin, 2 
Zoopies, 2 
Chapas, 1 
Chapis, 1 
Chingos, 1 
Zong Zwing, 1 
Grouches, 0 

Так вопрос: Как я сортирую только те участки карты, которые имеют те же точки (Целочисленные значения), а остальное как есть?

Я использую Java 7.

+0

Является ли использование карты обязательной? Вместо этого я бы использовал набор объектов. – SimoV8

+0

Я использовал компаратор. Будет ли добавлен этот код к вопросу, хотя я не думаю, что это возможно полезно. Вы можете видеть, что карта сортируется в соответствии со значением и что значения Integer на карте группируются вместе. –

+1

Вы не должны использовать карту. Используйте список , где Animal - класс с именем и значением. Сортируйте его с помощью компаратора, который сортирует по значению, затем сортирует по имени. –

ответ

1

Try:

public <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
    Comparator<K> valueComparator = new Comparator<K>() { 
     public int compare(K k1, K k2) { 
      int compare = map.get(k2).compareTo(map.get(k1)); 
      if (compare == 0) { 
       return k1.compareTo(k2); // <- To sort alphabetically 
      } else { 
       return compare; 
      } 
     } 
    }; 
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
    sortedByValues.putAll(map); 
    return sortedByValues; 
} 
+0

Это соединяет старую карту, новую карту и записи в ней все вместе, делая все это практически доступным только для чтения. Если какие-либо изменения будут выполнены, возникнут ошибки согласованности. – Henry

1

Вот пример того, как использовать компаратор. После сортировки вы можете поместить все записи из набора в LinkedHashMap, чтобы сохранить порядок элементов.

public static void main(String[] args) { 

    Map<String,Integer> map = new HashMap<String, Integer>(); 

    map.put("Tarantulas", 6); 
    map.put("Lions", 5); 
    map.put("Snakes", 2); 
    map.put("Zoopies", 2); 
    map.put("Zappin", 2); 
    map.put("Chapas", 1); 
    map.put("Zong Zwing", 1); 
    map.put("Chingos", 1); 
    map.put("Chapis", 1); 
    map.put("Grouches", 0); 

    SortedSet<Map.Entry<String, Integer>> sortedSet = new TreeSet<>(new Comparator<Map.Entry<String,Integer>>() { 
     @Override 
     public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 

      int result = o1.getValue().compareTo(o2.getValue()); 
      result*=-1; 
      if(result==0) 
       result = o1.getKey().compareTo(o2.getKey()); 

      return result; 
     } 
    }); 

    sortedSet.addAll(map.entrySet()); 


    for(Entry<String, Integer> entry:sortedSet) 
     System.out.println(entry.getKey()+"="+entry.getValue()); 

} 
+0

Почему бы не использовать структуру результатов «Список»? – Henry

+1

Затем он теряет функциональность карты. –

Смежные вопросы