Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印已排序树映射(基于值排序)_Java_Sorting_Comparator_Treemap - Fatal编程技术网

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

Java 打印已排序树映射(基于值排序),java,sorting,comparator,treemap,Java,Sorting,Comparator,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 但似乎具有相同值的单词是按相反顺序打印的: “流产,able,ab,aaron,aaa,aa,a”而不是“a,aa,aaa,aaron,ab,able流产”等等 我甚至想过将每一组具有相同值的键添加到树集并打印出来,但我无法基于下一个值进行迭

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

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;
    }
}
公共类MyComparator实现Comparator{
地图分幅地图;
公共MyCompariator(地图){
this.tiedMap=map;
}        
公共整数比较(字符串a、字符串b){
如果(tiedMap.get(a)>=tiedMap.get(b)){
返回-1;
}
其他的
返回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());
   }
}
Iterator it=tree.entrySet().Iterator();

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

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

if(tiedMap.get(a)>=tiedMap.get(b)){
    return -1;
}
else
    return 1;
当值相同时,您应该修改代码以返回0。这将确保原始键之间的相对顺序不会更改。如果这不起作用,您可以添加其他代码,如:

if (tiedMap.get(a) == tiedMap.get(b))
  return a.compareTo(b);
当值相同时,您应该修改代码以返回0。这将确保原始键之间的相对顺序不会更改。如果这不起作用,您可以添加其他代码,如:

if (tiedMap.get(a) == tiedMap.get(b))
  return a.compareTo(b);

实际上,通过使用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());
        }
    });

这将使输出按降序排列。通过仅交换o2和o1,您将按升序排列。

实际上,通过使用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());
        }
    });

这将使输出按降序排列。通过仅交换o2和o1,您将按升序对它们进行排序。

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

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

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);
    }
}
public int比较(字符串a、字符串b)
{
整数aVal=tiedMap.get(a);
整数bVal=tiedMap.get(b);
如果(aVal>bVal)
{
返回1;//或-1表示降序
}
否则如果(aVal
您的比较器将返回仅根据其值按相反顺序排序的条目。这是您想要的吗

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

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);
    }
}
public int比较(字符串a、字符串b)
{
整数aVal=tiedMap.get(a);
整数bVal=tiedMap.get(b);
如果(aVal>bVal)
{
返回1;//或-1表示降序
}
否则如果(aVal
您可以包括创建两个
树形图的代码行吗?A
TreeMap
不能有重复的“键”(在您的情况下,键是比较方法返回的)。您可以包括创建两个
树形图的代码行吗?A
TreeMap
不能有重复的“键”(在您的情况下,键是compare方法返回的内容)。当I
return 1
而不是
0
相等时,代码才起作用。这可能在您当前的输入序列中起作用,但并不总是如此。您必须明确选择是否需要键的相对顺序(当值相同时)要排序,或者希望它们与输入相同,即保持键的相对顺序不变。当i
返回1
时,代码有效,而不是当它们相等时
0
。这可能在当前输入序列中有效,但并不总是有效。您必须明确选择是否希望键的相对顺序(当值相同时)进行排序,或者您希望它们与输入相同,即保持键的相对顺序不变。更改为返回1有帮助,而不是在它们相等时返回0。我之前返回了-1。如果它们相等,您确实应该返回0(对于大于/小于,仍然是1或-1)。更改为返回1会有帮助,而不是在它们相等时返回0。.我之前返回了-1。如果它们相等,则确实应该返回0(对于大于/小于,仍然返回1或-1)我有点困惑,这就是为什么我在第一句中提到了这个问题。OP要求按值排序,而不是按键排序。我有点困惑,这就是为什么我在第一句中提到了这个问题。