java – 在根据值对地图进行排序时,缺少某些值.是什么导致这种奇怪的行为?

前端之家收集整理的这篇文章主要介绍了java – 在根据值对地图进行排序时,缺少某些值.是什么导致这种奇怪的行为?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图根据词频(即基于值)对地图进行排序.为此,我已经覆盖了比较器并传递给TreeMap,但我得到了这个奇怪的输出.
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}

解决方法

您的比较方法无法遵守Map接口的约定,因为它比较值而不是键.您的实现会导致具有相同值的两个键被视为相同的键.因此,您的sortedMap不包含“四”键,其值与“三”键相同.

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.

TreeMap reference

您可以通过在值相等时比较键来解决此问题:

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}

由于四个<三个基于字符串的自然顺序.

猜你在找的Java相关文章