首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印排序树状图(根据值排序)

打印排序树状图(根据值排序)
EN

Stack Overflow用户
提问于 2013-01-31 06:35:46
回答 4查看 3.1K关注 0票数 1

我有一个基于值的排序TreeMap,它是打印出来的,如下所示:

代码语言:javascript
复制
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的比较器。有人能帮我改正密码吗?以正确的顺序打印出来?

代码语言:javascript
复制
 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;
    }
}

下面是我试图打印的方法:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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);      
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-31 07:43:06

您的比较器将仅根据它们的值返回按反向顺序排序的条目。这是你想要的吗?

此外,如果希望以更可预测的顺序排列条目,还应该比较键:

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 07:04:32

代码语言:javascript
复制
if(tiedMap.get(a)>=tiedMap.get(b)){
    return -1;
}
else
    return 1;

当值相同时,应修改代码以返回0。这将确保您的原始键之间的相对顺序不会更改。如果这样做不起作用,您可以添加以下附加代码:

代码语言:javascript
复制
if (tiedMap.get(a) == tiedMap.get(b))
  return a.compareTo(b);
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 07:32:34

实际上,通过使用比较器,您可以将HashMap, TreeMap排序为升序和降序。

试试这个:

代码语言:javascript
复制
// 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,您将按升序排序它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14619833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档