【问题标题】:Collections.sort() doesn't work for custom ObjectsCollections.sort() 不适用于自定义对象
【发布时间】:2016-09-09 01:32:32
【问题描述】:

我正在尝试对我的列表进行排序,但这个不起作用。方法 collections.sort() 什么都不做。

public boolean schedule(){
    List<Task> keys = new ArrayList<Task>(g.tasks.keySet());
    for(int i = 0; i<keys.size();i++){
        System.out.println(keys.get(i).getSize());
    }
    Collections.sort(keys);
    for(int i = 0; i<keys.size();i++){
        System.out.println(keys.get(i).getSize());
    }
    return true;
}

这是我在 Task 类中的 compareTo() 方法:

public int compareTo(Task t1) {
    Integer csize = new Integer(t1.size);
    int cmp = csize.compareTo(t1.size);

    return cmp;
}

这个方法有什么问题?

【问题讨论】:

    标签: java sorting object collections


    【解决方案1】:

    collections.sort 不适用于自定义对象

    当然可以,但在您的情况下不会,因为您的 compareTo 方法已损坏。您将 t1 的大小与其自身进行比较,而不是与 this 的大小进行比较

    你有:

    public int compareTo(Task t1) {
        Integer csize = new Integer(t1.size);  // get t1's size
        int cmp = csize.compareTo(t1.size);  // ???? compare with t1's size ???
    
        return cmp;
    }
    

    您需要将其更改为:

    public int compareTo(Task t1) {
        return Integer.compare(this.size, t1.size);
    }
    

    所以现在您将参数的大小与当前对象的大小进行比较。

    【讨论】:

    • 非常感谢,还有一个小问题。我怎样才能将它从最低到最高排序,因为现在是相反的
    • @Buszman:哦,这很简单——我敢打赌,如果你猜到了,你可以在几秒钟内搞定——那么,你怎么看?
    • @Buszman:提示——你只需要稍微改变我的一行代码。
    • 我想反向比较对象
    • @Buszman:是的!另一种选择是做,Collections.sort(keys, Collections.reverseOrder());
    【解决方案2】:

    compareTo 中有一个错误,已在接受的答案中指出。我提供一个额外的答案只是为了提供一个不同的习语,你可能会考虑定义一个类的自然顺序:

    class Task implements Comparable<Task> {
        private static final Comparator<Task> ORDER = Comparator
            .comparingInt(Task::getSize)
            .reversed()
            .thenComparing(Task::getPriority);
    
        public int compareTo(Task other) {
            return ORDER.compare(this, other);
        }
    }
    

    这种委托习语的潜在优势在于,在随意阅读传统的compareTo 实现时,很容易错过诸如颠倒比较的参数顺序之类的东西。该声明使其非常明确。这也意味着您可以使用Comparator 的所有功能(例如,决定空值是第一个还是最后一个)。

    【讨论】:

    • 不错的答案 1+!
    【解决方案3】:

    @HoverCraft 已经发布了答案。 除此之外

    //For ASC
    public int compareTo(Task t1) {
       return (this.size - t1.size);
    }
    //For DESC
    public int compareTo(Task t1) {
       return (t1.size - this.size);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多