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()); } }); 
  1. 我可以匿名做上述吗?
  2. 我还能怎么做?
  3. 我想通过Value not the Key来sortingmyMap

你不能对值进行sorting。

基于红黑树的NavigableMap实现。 映射按照键的自然顺序sorting,或者在映射创build时提供的comparator进行sorting,具体取决于使用哪个构造函数。您将需要为Comparator<? super K>提供comparator Comparator<? super K> Comparator<? super K>所以你的比较器应该比较键。

要提供sorting值,您将需要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] 

比较器只能用于键,而不能用于整个input。 它根据键对条目进行sorting。

你应该改变它如下

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

更新

你可以做如下的事情(在地图上创build一个条目列表,并根据值对列表进行sorting,但注意这不会对地图本身进行sorting) –

 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()); } }); 

您可以滑动键和值。 例如

  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());