有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java打印排序树映射(基于值排序)

我有一个基于值排序的树形图,它的打印方式如下所示:

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

但似乎具有相同值的单词是按相反顺序打印的:

“流产,able,ab,aaron,aaa,aa,a”而不是“a,aa,aaa,aaron,ab,able流产”等等

我甚至想过将每一组具有相同值的键添加到树集并打印出来,但我无法基于下一个值进行迭代

这是我要传递给树形图的比较器。有人能帮我修改代码以正确的顺序打印吗

 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());
   }
}

编辑:我将输入读入一个树映射,然后将其传递给另一个树映射

编辑:创建树映射的代码:

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);      

共 (4) 个答案

  1. # 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);
    
  2. # 2 楼答案

    实际上,通过使用comparator,您可以将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. # 3 楼答案

    比较器将返回仅基于其值按相反顺序排序的条目。这就是你想要的吗

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

    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);
        }
    }
    
  4. # 4 楼答案

    我不确定我是否完全理解您的期望/实现,但我认为您需要在比较函数中对字符串a和b进行字符对字符的比较