比较器在TreeMap中创建重复项

时间:2014-12-06 15:51:19

标签: java sorting map comparator treemap

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

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

CODE

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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 :(得分:0)

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

  

比较其订单的两个参数。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

您的代码只执行1和-1 怎么样的0?