2015-01-08 47 views
0

我正在努力完成以下任务: 我将一个字符和整数(int是特定字符的外观数)添加到一个LinkedHashMap中(是的,不幸的是我必须使用这个)。根据其值排序LinkedHashMaps

如何打印出订购者?

LinkedHashMap<Character, Integer> map = new LinkedHashMap(); 
int a=7; 
int b=6; 
int c=9; 
map.put('a', a); 
map.put('b', b); 
map.put('c', c); 

输出应该是这样的:

c 9 
a 7 
b 6 
+2

你能解释一下你试过的吗?有大量的重复http://stackoverflow.com/questions/12184378/sorting-linkedhashmap – sidgate

+0

你可以在地图中存储原始数据类型,我相信你可以只存储对象。你有包装类来做到这一点。 – saikumarm

+0

为什么'c 9 a 7 b 6'? – xehpuk

回答

0

你可以在地图转换为TreeMap可以进行排序。默认的地图是由按键,在您使用整数,应该对你有足够的自然顺序进行排序...

TreeMap tm = new TreeMap(map); 
+0

这将只在*自然顺序*中排序。哪些不是OP要的 – TheLostMind

+0

还有一个TreeMap的构造函数,它使用比较器:TreeMap(比较器比较器)。实现一个将整数降序排列而不是升序的比较器应该很容易。 –

0

如何尝试这样,

的方法基于排序地图值DESC

public static Map<Character, Integer> mapSortedByValues(Map<Character, Integer> map) { 
    List<Map.Entry<Character, Integer>> entryList = new LinkedList<Map.Entry<Character, Integer>>(map.entrySet()); 
    Collections.sort(entryList, 
      new Comparator<Map.Entry<Character, Integer>>() { 
       @Override 
       public int compare(Map.Entry<Character, Integer> e1, Map.Entry<Character, Integer> e2) { 
        return (e1.getValue()).compareTo(e2.getValue()); 
       } 
      } 
    ); 
    Collections.reverse(entryList); //Reverse value DESC 
    Map<Character, Integer> sortedMap = new LinkedHashMap<Character, Integer>(); 
    for (Map.Entry<Character, Integer> entry : entryList) 
     sortedMap.put(entry.getKey(), entry.getValue()); 
    return sortedMap; 
} 

测试值排序;

public static void main(String[] args) { 
    LinkedHashMap<Character, Integer> map = new LinkedHashMap<Character, Integer>(); 
    map.put('a', 7); 
    map.put('b', 9); 
    map.put('c', 6); 

    Map sortedMap = mapSortedByValues(map); 
    System.out.println(sortedMap); 
} 

将输出

{c=9, a=7, b=6} 
0
  1. 把地图在列表中。
  2. 对列表排序。
  3. 把列表放回地图。
  4. 将排序后的地图留给您的地图。

下面的代码

List list =new LinkedList<Map.Entry<String, Integer>>(map.entrySet()); 

Collections.sort(list, (Map.Entry o1, Map.Entry o2) ->{ 
         return (o2.getValue()).compareTo(o1.getValue()) 
       }); 

Map result = new LinkedHashMap<String, Integer>(); 
for (Map.Entry entry : list){ 
    result.put(entry.getKey(), entry.getValue()); 
} 

map = result 
0
map.entrySet().stream() 
    .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) 
    .forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue())); 

这颠倒了正常的compareTo使顺序颠倒。如果你可以使用自然顺序,那么它就更简单了:

.sorted(Map.Entry::comparingByValue)