Frage

Betrachten Sie diesen Code ein:

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;
   }
}
War es hilfreich?

Lösung

Ihre Klasse implementiert Comparator<jm45> statt Comparable<jm45>.

Ein Comparator weiß, wie zwei Objekte vergleichen - ein Comparable weiß, wie einen anderen zu vergleichen mit mir selbst

.

Sie müssen entweder in einem Komparator passieren für sort() (als zweites Argument) zu verwenden oder die Werte müssen vergleichbar sein.

Hier ist eine Version, die die Comparable Schnittstelle verwendet statt:

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

Und hier ist eine Version, die die Comparator-Schnittstelle verwendet:

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());
    }
}

Es gibt nichts zu Stop eine Klasse Comparator<T> für sich die Umsetzung, aber es ist ein wenig seltsam für sie, dies zu tun. Zum Beispiel würde man normalerweise nicht eine Saite fragt beide andere miteinander zu vergleichen - es nichts bekommt ist mit der ursprünglichen Zeichenfolge selbst zu tun

.

Andere Tipps

Von der Collections.sort javadoc:

Sortiert die angegebene Liste in aufsteigender Reihenfolge, nach dem natürliche Reihenfolge seiner Elemente. Alle Elemente in der Liste müssen implementieren die Schnittstelle Comparable . Darüber hinaus können alle Elemente in der Liste muss für beide Seiten vergleichbar (das heißt, e1.compareTo (e2) darf keinen Classcast werfen für jedes Element e1 und e2 in der Liste).

Ihre Klasse implementiert Komparator, nicht vergleichbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top