我想按值排序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
答案 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?