Question

Considérez ce code:

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;
   }
}
Était-ce utile?

La solution

Votre classe implémente Comparator<jm45> au lieu de Comparable<jm45>.

Comparator sait comment comparer deux objets - un Comparable sait comment comparer un autre avec lui-même

.

Vous avez besoin soit de passer dans un comparateur pour sort() à utiliser (comme second argument) ou les valeurs doivent être comparables.

Voici une version qui utilise l'interface Comparable place:

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

Et voici une version qui utilise l'interface 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());
    }
}

Il n'y a rien à arrêt une classe implémentant Comparator<T> pour lui-même, mais il est un peu étrange pour elle de le faire. Par exemple, vous ne demanderiez pas normalement une chaîne à comparer deux autres les uns avec les autres - il n'a rien à voir avec la chaîne d'origine lui-même

.

Autres conseils

De la javadoc Collections.sort:

trie la liste spécifiée dans l'ordre croissant, en fonction de la ordre naturel de ses éléments. Tous les éléments de la liste doivent implémenter l'interface Comparable . En outre, tous les éléments dans la liste doit être mutuellement comparables (qui est, e1.compareTo (e2) ne doit pas jeter un ClassCastException pour tous les éléments e1 et e2 dans la liste).

Votre classe implémente Comparator, pas comparables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top