我根据值对一个TreeMap进行了排序,它的打印如下所示:
abortion-2
able-2
ab-2
aaron-2
aaa-2
aa-2
a-2
absent-1
absence-1
abraham-1
ability-1
aberdeen-1
abc-1
但似乎具有相同值的单词以反向排序顺序打印:
“abortion,able,ab,aaron,aaa,aa,a” 而不是 “a,aa,aaa,aaron,ab ,能够堕胎“ 等等。
我甚至想过将每组具有相同值的键添加到TreeSet并将其打印出来,但我无法根据下一个值进行迭代。
这是我传递给TreeMap的比较器。任何人都可以帮我纠正代码,以正确的顺序打印它吗?
public class MyComparator implements Comparator<String>{
Map<String, Integer> tiedMap;
public MyComparator(Map<String, Integer> map){
this.tiedMap = map;
}
public int compare(String a, String b){
if(tiedMap.get(a)>=tiedMap.get(b)){
return -1;
}
else
return 1;
}
}
以下是我试图打印的方式:
Iterator it = tree.entrySet().iterator();
for(int i=0; i<n; i++){
if(it.hasNext()){
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey()+"-"+pairs.getValue());
}
}
编辑:我正在将输入读入TreeMap,然后将其传递给另一个TreeMap。
编辑:创建TreeMaps的代码:
Map<String, Integer> map = new TreeMap<String, Integer>();
Words t = new Words();
MyComparator comp = w.(new MyComparator(map));
Map<String, Integer> tree = new TreeMap<String, Integer>(comp);
int size = Integer.parseInt(buffer.readLine());
for(int i = size; i>0; i--){
reader = buffer.readLine();
if(map.get(reader)!=null){
map.put(reader, map.get(reader)+1);
}
else
map.put(reader, 1);
}
tree.putAll(map);
答案 0 :(得分:1)
if(tiedMap.get(a)>=tiedMap.get(b)){
return -1;
}
else
return 1;
您应修改代码,以便在值相同时返回0。这将确保不更改原始键之间的相对顺序。如果这不起作用,您可以添加其他代码,如:
if (tiedMap.get(a) == tiedMap.get(b))
return a.compareTo(b);
答案 1 :(得分:1)
您的比较器将仅根据其值返回以相反顺序排序的条目。这是你想要的吗?
此外,如果您希望以更可预测的顺序输入条目,您还应该比较这些键:
public int compare(String a, String b)
{
Integer aVal = tiedMap.get(a);
Integer bVal = tiedMap.get(b);
if (aVal > bVal)
{
return 1; // or -1 for descending order
}
else if (aVal < bVal)
{
return -1; // or 1 for descending order
}
else
{
// if values are equivalent compare on key as well
return a.compareTo(b);
// or for descending order:
// return b.compareTo(a);
}
}
答案 2 :(得分:0)
实际上,通过使用比较器,您可以将HashMap, TreeMap
分为升序和降序。
试试这个:
// sort list based on comparator
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o2)).getValue())
.compareTo(((Map.Entry) (o1)).getValue());
}
});
这将使输出按降序排列。按interchanging the o2 and o1 only
,您将按升序排序。
答案 3 :(得分:-1)
我不确定我是否完全理解你的期望/实现,但我认为你需要在比较函数中对字符串a和b进行字符到字符的比较。