2

考虑这段代码:

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

2 回答 2

15

您的类实现Comparator<jm45>而不是Comparable<jm45>.

AComparator知道如何比较两个对象 - AComparable知道如何将另一个对象与自身进行比较。

您要么需要传入一个比较器以供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>为自己实现,但这样做有点奇怪。例如,您通常不会要求一个字符串将另外两个字符串相互比较——这与原始字符串本身无关。

于 2009-07-23T18:59:24.253 回答
2

来自 Collections.sort javaDoc:

根据其元素的自然顺序,将指定列表按升序排序。 列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素必须相互可比较(即,e1.compareTo(e2) 不得为列表中的任何元素 e1 和 e2 抛出 ClassCastException)。

你的类实现了比较器,而不是可比较的。

于 2009-07-23T19:04:19.127 回答