2012-08-29 107 views
33

如何根据LinkedHashMap的值和LinkedHashMap包含String和Integer来对LinkedHashMap进行排序。所以我需要根据整数值进行排序。 非常感谢Sorting LinkedHashMap

+2

你必须使用一个LinkedHashMap的? TreeMap可能有帮助吗? – RNJ

+2

这可能有助于http://stackoverflow.com/questions/780541/how-to-sort-hash-map – RNJ

+0

哦。我懂了。没有仔细阅读评论。^_^ – DankMemes

回答

26

这是现在更容易与Java 8流了不少:你不需要中间地图排序:

map.entrySet().stream() 
    .sorted(Map.Entry.comparingByValue()) 
    .forEach(entry -> ...); 
4

LinkedHashMap只是维持广告订单。如果您想根据价值进行排序,您可能需要编写自己的comparator

+1

辉煌,是的,非常感谢,我确实编写了自己的比较器 – Ramin

+1

我认为您不需要编写自己的比较器。 'Map.Entry.comparingByValue()'应该为你生成一个。它可以通过'Collections.reverseOrder(Map.Entry.comparingByValue())'来反转。 – sprinter

+0

@sprinter:如果值是任何自定义对象的类型,该怎么办? – kosa

66
List<Map.Entry<String, Integer>> entries = 
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){ 
    return a.getValue().compareTo(b.getValue()); 
    } 
}); 
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); 
for (Map.Entry<String, Integer> entry : entries) { 
    sortedMap.put(entry.getKey(), entry.getValue()); 
} 
+4

那么该死的,我写的是完全相同的代码! :)除了最后一部分,我不认为OP实际上需要将它们放回地图中。 –

+0

非常感谢。非常有用的一段代码 – Ramin

+0

很好的答案。我必须按降序排序,并在比较器返回值时添加-ve符号。 –

1
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.NavigableMap; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class HashMapTest { 

public static void main(String[] args) { 

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

    map.put("a", 11); 
    map.put("B", 12); 
    map.put("c", 3); 
    map.put("d", 4); 
    map.put("e", 5); 
    map.put("f", 6); 
    map.put("g", 7); 
    map.put("h", 8); 
    map.put("i", 9); 
    map.put("j", 3); 
    map.put("k", 2); 
    map.put("l", 1); 

    List<Map.Entry<String, Integer>> entries = new 
    ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(entries,new CustomizedHashMap()); 


      Map<String, Integer> sortedMap = new LinkedHashMap<String, 
    Integer>(); 
      for (Map.Entry<String, Integer> entry : entries) { 
       sortedMap.put(entry.getKey(), entry.getValue()); 
       System.out.print(sortedMap.put(entry.getKey(), 
      entry.getValue())+" "); 
      } 
    } 
    } 

class CustomizedHashMap implements Comparator<Map.Entry<String, Integer>> { 

    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
    // TODO Auto-generated method stub 
    return -o1.getValue().compareTo(o2.getValue()); 
    } 

}