我有一个基于值的排序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但是,似乎具有相同值的单词正以相反的排序顺序打印:
“流产”、“能够”、“ab”、“亚伦”、“aaa”、“aa”、“而不是"a、”aa“、”aaa“、”亚伦“、”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); 发布于 2013-01-31 07:43:06
您的比较器将仅根据它们的值返回按反向顺序排序的条目。这是你想要的吗?
此外,如果希望以更可预测的顺序排列条目,还应该比较键:
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);
}
}发布于 2013-01-31 07:04:32
if(tiedMap.get(a)>=tiedMap.get(b)){
return -1;
}
else
return 1;当值相同时,应修改代码以返回0。这将确保您的原始键之间的相对顺序不会更改。如果这样做不起作用,您可以添加以下附加代码:
if (tiedMap.get(a) == tiedMap.get(b))
return a.compareTo(b);发布于 2013-01-31 07:32:34
实际上,通过使用比较器,您可以将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,您将按升序排序它们。
https://stackoverflow.com/questions/14619833
复制相似问题