【问题标题】:Comparing Nodes with Collections.sort用 Collections.sort 比较节点
【发布时间】:2013-11-21 13:23:49
【问题描述】:

我得到了一个包含一些 Tree 节点的列表,并且想要对其进行排序。作为比较器,我使用列表中每个节点都拥有的双变量。

这是我的代码:

List<TreeNode<String>> list = inputNode.getChildren();

for(TreeNode<String> childNode : list)
   {
    Collections.sort(list, childNode.costs);
   }

TreeNode 是这样定义的:

public class TreeNode<T> {

public T data;
public double costs;
public List<TreeNode<T>> children;

// Bunch of getters and setters
}

我要做的是对子节点列表进行排序(降序)。我不想写已经存在的新东西。那为什么我不能使用Collections.sort

Collections.sortdouble 不是可比较的数据类型吗?

【问题讨论】:

    标签: java sorting collections nodes


    【解决方案1】:

    你应该以稍微不同的方式使用它。

    TreeNode 必须实现 Comparable http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html 或将比较器编写为匿名类。

     public class TreeNode<T> implements Comparable {
    
     public T data;
     public double costs;
     public List<TreeNode<T>> children;
    
     // Bunch of getters and setters
    
     public int compareTo(TreeNode that) { return (int)(this.cost - that.cost); }
     }
    

     Collections.sort(ls, new Comparator() 
                           {
    
                            public int compare(Object o1, Object o2) 
                            {
                               //typecast and compare here
                            }
                           }    
                    );
    

    而且,不要在循环中调用 Collections.sort。一个电话就够了。

    【讨论】:

    • 我尝试在TreeNode 中实现整个排序,但没有成功。我将使用compareTo 方法。谢谢
    【解决方案2】:

    您有两种选择: 1) 使类 TreeNode 实现 Comparable> 并实现 compareTo 方法, 2) 创建一个 Comparator> 并使用 Collections.sort(list,comparator);

    【讨论】:

      【解决方案3】:

      我可能错了,但TreeNode&lt;T&gt; 本身不应该实现 Comparable 吗?然后你可以比较节点上的值吗?

      【讨论】:

        猜你喜欢
        • 2016-02-25
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多