public class WordFrequency { public static String sentence = "one three two two three three four four four"; public static Map<String,Integer> map; public static void main(String[] args) { map = new HashMap<>(); String[] words = sentence.split("\\s"); for (String word : words) { Integer count = map.get(word); if (count == null) { count = 1; } else { ++count; } map.put(word,count); } Comparator<String> myComparator = new Comparator<String>() { @Override public int compare(String s1,String s2) { if (map.get(s1) < map.get(s2)) { return -1; } else if (map.get(s1) > map.get(s2)) { return 1; } else { return 0; } } }; SortedMap<String,Integer> sortedMap = new TreeMap<String,Integer>(myComparator); System.out.println("Before sorting: " + map); sortedMap.putAll(map); System.out.println("After Sorting based on value:" + sortedMap); } }
输出:
Before sorting: {two=2,one=1,three=3,four=3} After sorting based on value:{one=1,two=2,three=3}
预期产出:
{one=1,four=3,three=3}
解决方法
Note that @H_502_18@the ordering maintained by a tree map,like any sorted map,and whether or not an explicit comparator is provided,@H_502_18@must be consistent with equals if this sorted map is to correctly implement the Map interface. (See Comparable or Comparator for a precise definition of consistent with equals.) @H_502_18@This is so because the Map interface is defined in terms of the equals operation,but a sorted map performs all key comparisons using its compareTo (or compare) method,so @H_502_18@two keys that are deemed equal by this method are,from the standpoint of the sorted map,equal. The behavior of a sorted map is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Map interface.
您可以通过在值相等时比较键来解决此问题:
Comparator<String> myComparator = new Comparator<String>() { @Override public int compare(String s1,String s2) { if (map.get(s1) < map.get(s2)) { return -1; } else if (map.get(s1) > map.get(s2)) { return 1; } else { return s1.compareTo(s2); } } };
这应该给你一个输出:
After sorting based on value:{one=1,three=3}
由于四个<三个基于字符串的自然顺序.