我知道compareTo可以返回正负值和零值。
所以,如果我使用
public class x implements Comparable <Object O> {/*...*/}
并在内部分配
public int compareTo(int i) {
if (this.intg < i) { return -1; }
else if (this.intg > i) { return 1; }
else { return 0; }
}
我能以这种方式使用排序Array.sort(O[]objects)
吗?
我不知道array.sort()
和compareTo()
的关联。
它甚至不会调用compare方法对其进行排序。
那么compareTo()
输入真正做了什么?如果我在使用array.sort()
答案 0 :(得分:3)
这是Arrays.sort(Object[])
的Javadoc:
根据元素的自然顺序,将指定的对象数组按升序排序。数组中的所有元素都必须实现Comparable接口。此外,数组中的所有元素必须具有可比性(即
e1.compareTo(e2)
不得为数组中的任何元素ClassCastException
和e1
抛出e2
/强>)。
因此sort方法确实依赖于数组元素的Comparable
接口。
答案 1 :(得分:-1)
您可以使用Collections.sort
方法对List
个对象进行现场排序。第二个参数是您的Comparator
实施。
示例:
List<Animal> animals = .. some ArrayList for example;
Comparator<Animal> comparator = new Comparator<Animal>() {
public int compare(Animal d1, Animal d2) {
int v1 = d1.intg;
int v2 = d2.intg;
return (v1 > v2 ? 1 : (v1 == v2 ? 0 : -1));
}
};
Collections.sort(animals, comparator);
// the 'animals' collection is now sorted based on the `intg` property
答案 2 :(得分:-1)
通常,您最好创建一个Comparator而不是实现Comparable。然后,您可以将其传递给集合排序方法:
Collections.sort(myArrayList, new Comparator<MyObject>(){
public int compare(MyObject o1, MyObject o2){
return Integer.compare(o1.value == o2.value);
}
});
编辑:
在阅读了一些OP评论之后,我们可以证明compareTo方法确实被调用了:
public class TestClass implements Comparable<TestClass> {
private int value;
public int getValue(){
return this.value;
}
public void setValue(int v){
this.value = v;
}
@Override
public int compareTo(TestClass arg) {
System.out.println("In compareTo");
return Integer.compare(this.value, arg.value);
}
}
如果我们再做以下事情:
ArrayList<TestClass> a = new ArrayList<>();
for( int i = 0; i < 10; i++ ){
TestClass t = new TestClass();
t.setValue(i);
a.add(t);
}
System.out.println("Before sort.");
Collections.sort(a);
我们将看到compareTo方法是从sort方法中调用的,因为终端将显示我们的trace语句:
Before sort.
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo