考虑以下代码:

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;
   }
}
有帮助吗?

解决方案

您类实现的,而不是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>,但它是一个有点奇怪它这样做。举例来说,你通常不会问一个字符串到两个其他的人相互比较 - 它什么都没有做与原始字符串本身

其他提示

从Collections.sort JAVADOC:

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

您类实现比较器,不具有可比性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top