我正在尝试对我的列表进行排序,但这个不起作用。方法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;
}
这种方法有什么问题?
答案 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);
}