2016-06-07 4 views
0

Я пытаюсь сортировать LinkedHashMap на основе его значений. То, что я не понимаю, - это результаты. Кажется, что он использует только два ключа для сортировки. Любые указания относительно того, чего я не вижу?LinkedHashMap сортировка

public class test { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 


     LinkedHashMap<Integer, Integer> sorting = new LinkedHashMap<Integer, Integer>(); 
     sorting.put(1, 100); 
     sorting.put(10, 100); 
     sorting.put(20, 200); 
     sorting.put(30, 100); 
     sorting.put(40, 100); 
     sorting.put(50, 200); 

     for (Entry<Integer, Integer> entry : sorting.entrySet()) { 
      Integer key = entry.getKey(); 
      Integer value = entry.getValue(); 
      System.out.println("LINKED UNSORTED === key: "+ key + '\t' + "Value: " + value); 
       // do stuff 
      } 


     Comparator<Integer> comparator = new ValueCom(sorting); 
     TreeMap<Integer, Integer> sortedMap =new TreeMap<Integer, Integer>(comparator); 
     sortedMap.putAll(sorting);  


     for (Entry<Integer, Integer> entry : sortedMap.entrySet()) { 
      Integer key = entry.getKey(); 
      Integer value = entry.getValue(); 
      System.out.println("SORTED === key: "+ key + '\t' + "Value: " + value); 
       // do stuff 
      } 

    } 

} 


class ValueCom implements Comparator<Integer> { 
    LinkedHashMap<Integer, Integer> map = new LinkedHashMap<Integer, Integer>(); 

public ValueCom(HashMap<Integer, Integer> map) { 
     this.map.putAll(map); 
    } 

public int compare(Integer keyA, Integer keyB){ 

    return map.get(keyB).compareTo(map.get(keyA)); 
} 

} 

Выход по току, как объяснено выше

LINKED UNSORTED === key: 1 Value: 100 
LINKED UNSORTED === key: 10 Value: 100 
LINKED UNSORTED === key: 20 Value: 200 
LINKED UNSORTED === key: 30 Value: 100 
LINKED UNSORTED === key: 40 Value: 100 
LINKED UNSORTED === key: 50 Value: 200 
SORTED === key: 20 Value: 200 
SORTED === key: 1 Value: 100 

ответ

0

В TreeMap уникальность ключей определяется пройденный Comparator. Так как ваш Comparator сравнивает значения оригинала Map, все записи, имеющие одинаковое значение, считаются TreeMap, чтобы иметь один и тот же ключ, поэтому для каждого уникального значения добавляется только одна запись для TreeMap.

Если вы хотите Map отсортированных по значениям, вы можете использовать LinkedHashMap для вашего отсортирован Map, и убедитесь, что вы поместили записи в Map в нужном порядке.

+0

переосмысление «Map» для результатов «TreeMap» в том же выходе, как и раньше. – Betafish

+0

@Betafish Что вы подразумеваете под «Переопределением« Карты »в« TreeMap »и почему вы ожидали, что это изменит ситуацию? – Eran

0

Проблема заключается в том, что вы сортируете по значению, а если два значения равны, то TreeMap будет делать только одну запись для этого ключа, вы можете понять лучше, увидев ниже код. Ниже код будет решить эту проблему, дайте мне знать Если что-то не удается:

Изменить compare() метод ValueCom класса, как показано ниже:

public int compare(Integer i1, Integer i2) { 
     if(map.get(i1).equals(map.get(i2))){ 
      return 1; //To make sure, If values are equal then still there should be entry in TreeMap 
     } 
     return map.get(i1).compareTo(map.get(i2)); 
    } 

Теперь, равные значения случай также обрабатывается. :)

0

ниже код даст вам то, что вы хотите

public class test { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 


    LinkedHashMap<Integer, Integer> sorting = new LinkedHashMap<Integer, Integer>(); 
    sorting.put(10, 100); 
    sorting.put(1, 100); 
    sorting.put(20, 200); 
    sorting.put(40, 100); 
    sorting.put(30, 100); 
    sorting.put(50, 200); 

    for (Entry<Integer, Integer> entry : sorting.entrySet()) { 
     Integer key = entry.getKey(); 
     Integer value = entry.getValue(); 
     System.out.println("LINKED UNSORTED === key: "+ key + '\t' + "Value: " + value); 
      // do stuff 
     } 


    Comparator<Integer> comparator = new ValueCom(); 
    TreeMap<Integer, Integer> sortedMap =new TreeMap<Integer, Integer>(comparator); 
    sortedMap.putAll(sorting);  


    for (Entry<Integer, Integer> entry : sortedMap.entrySet()) { 
     Integer key = entry.getKey(); 
     Integer value = entry.getValue(); 
     System.out.println("SORTED === key: "+ key + '\t' + "Value: " + value); 
      // do stuff 
     } 

} 

} 


class ValueCom implements Comparator<Integer> { 
public int compare(Integer keyA, Integer keyB){ 

return keyA.compareTo(keyB); 
} 

}