Collections.sort()不适用于自定义对象

时间:2016-09-09 01:32:32

标签: java sorting object collections

我正在尝试对我的列表进行排序,但这个不起作用。方法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;
}

这种方法有什么问题?

3 个答案:

答案 0 :(得分:5)

  

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

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

答案 1 :(得分:3)

您在接受的答案中指出了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的所有功能(例如,判断空值是第一个还是最后一个)。

答案 2 :(得分:0)

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