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は2つのオブジェクトを比較するComparable方法を知っています-aは別のオブジェクトをそれ自体と比較する方法を知っています。

sort()(2番目の引数として)使用するにはコンパレータを渡す必要があるか、値が比較可能である必要があります。

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つの文字列を相互に比較するように依頼することはありません。元の文字列自体とは何の関係もありません。

于 2009-07-23T18:59:24.253 に答える
2

Collections.sort javaDocから:

要素の自然順序に従って、指定されたリストを昇順で並べ替えます。 リスト内のすべての要素は、Comparableインターフェースを実装する必要があります。さらに、リスト内のすべての要素は相互に比較可能である必要があります(つまり、e1.compareTo(e2)は、リスト内の要素e1およびe2に対してClassCastExceptionをスローしてはなりません)。

クラスはComparableではなくComparatorを実装します。

于 2009-07-23T19:04:19.127 に答える