【问题标题】:Comparator creates duplicates in TreeMap比较器在 TreeMap 中创建重复项
【发布时间】:2014-12-06 15:51:19
【问题描述】:

我想按值对我的HashMap(或TreeMap)进行排序。我通过创建一个按值排序的自定义Comparator 来实现这一点。但是,每当我再次输入来自HashMap 的所有条目时,我都会得到重复。

如何在不重复的情况下按值排序?

代码

public class Test {
    public static void main(String[] args) {

        HashMap<Integer, String> hMap = new HashMap<Integer, String>();
        ValueComparator vc = new ValueComparator(hMap);
        TreeMap<Integer, String> tMap = new TreeMap<Integer, String>(vc);

        hMap.put(0, "b");
        hMap.put(1, "c");
        hMap.put(2, "a");
        tMap.putAll(hMap);
        tMap.putAll(hMap);

        for (Map.Entry<Integer, String> entry : tMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }
}

class ValueComparator implements Comparator<Integer> {
    Map<Integer, String> base;

    public ValueComparator(Map<Integer, String> base) {
        this.base = base;
    }

    public int compare(Integer a, Integer b) {
        if (base.get(a).charAt(0) >= base.get(b).charAt(0))
             return 1;
        else return -1;
    }
}

输出

2 a
2 a
0 b
0 b
1 c
1 c

【问题讨论】:

  • 您的意见是什么?为什么要按第 0 个字符进行比较,在您的情况下这是一个可行的比较吗?为什么在相等的情况下返回 1 而不是 0?
  • 这只是我的问题的一个演示。但正如你所说,我并没有完全理解比较器的实现!

标签: java sorting map comparator treemap


【解决方案1】:

你需要修改逻辑如下,处理-1, 0 and 1的三种情况

public int compare(Integer a, Integer b) {
        if (base.get(a).charAt(0) == base.get(b).charAt(0))
            return 0;

        else if (base.get(a).charAt(0) > base.get(b).charAt(0))
            return 1;

        else
            return -1;
    }

输出

2 a
0 b
1 c

【讨论】:

    【解决方案2】:

    如果两个对象相等,compare 方法应该返回 0。在您的实现中,您返回 1,因此地图无法正确识别重复项。

    解决此问题的一种方法是重用Character.compare 来比较两个chars:

    public int compare(Integer a, Integer b) {
        return Character.compare
                  (base.get(a).charAt(0), base.get(b).charAt(0));
    }
    

    【讨论】:

      【解决方案3】:

      您的比较器合同是错误的。比较方法合同说:

      比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

      你的代码只做 1 和 -1 0 呢?

      【讨论】:

        猜你喜欢
        • 2020-08-09
        • 1970-01-01
        • 2021-10-11
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 2016-08-08
        相关资源
        最近更新 更多