考虑以下代码:
import java.util.*;
class jm45 implements Comparator<jm45>
{
private int x;
jm45(int input) { x = input; }
public static void main( String args[] )
{
List list = new ArrayList();
list.add(new jm45(2));
list.add(new jm45(2));
Collections.sort(list); //faulty line
}
public int compare( jm45 t1 , jm45 t2 )
{
return t1.x - t2.x;
}
}
答案 0 :(得分:15)
您的班级实施Comparator<jm45>
而不是Comparable<jm45>
。
Comparator
知道如何比较两个对象 - Comparable
知道如何比较另一个对象。
您需要传递一个比较器sort()
才能使用(作为第二个参数),或者值必须具有可比性。
以下是使用Comparable
界面的版本:
import java.util.*;
class Test implements Comparable<Test>
{
private int x;
Test(int input)
{
x = input;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list);
}
public int compareTo(Test other)
{
return x - other.x;
}
}
这是一个使用Comparator
界面的版本:
import java.util.*;
class TestComparator implements Comparator<Test>
{
public int compare(Test t1, Test t2)
{
return t1.getX() - t2.getX();
}
}
class Test
{
private int x;
Test(int input)
{
x = input;
}
int getX()
{
return x;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list, new TestComparator());
}
}
没有什么可以停止为自己实现Comparator<T>
的类,但这样做有点奇怪。例如,你通常不会要求一个字符串将另外两个字符串相互比较 - 它与原始字符串本身无关。
答案 1 :(得分:2)
来自Collections.sort javaDoc:
按照升序对指定列表按升序排序 其元素的自然排序。 列表中的所有元素都必须 实现Comparable接口。此外,所有元素 在列表中必须相互比较(即, e1.compareTo(e2)不得抛出ClassCastException 对于列表中的任何元素e1和e2。)
你的类实现Comparator,而不是Comparable。