[英]Comparator creates duplicates in TreeMap
我想按值對我的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;
}
}
OUTPUT
2 a
2 a
0 b
0 b
1 c
1 c
如果兩個對象相等,則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, 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
您的比較者合同錯誤。 比較方法合同說:
比較其兩個參數的順序。 當第一個參數小於,等於或大於第二個參數時,返回負整數,零或正整數。
您的代碼僅執行1和-1,那么0呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.