Pergunta

Considere este código:

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;
   }
}
Foi útil?

Solução

Seus implementos classe Comparator<jm45> vez de Comparable<jm45>.

A Comparator sabe como comparar dois objetos -. A Comparable sabe como comparar um outro com a própria

, quer necessidade de passar em um comparador para sort() para utilização (como o segundo argumento) ou os valores têm de ser comparáveis.

Aqui está uma versão que usa a interface Comparable vez:

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

E aqui está uma versão que usa a 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());
    }
}

Não há nada a Parar a classe implementando Comparator<T> por si mesmo, mas é um pouco estranho para ele a fazê-lo. Por exemplo, você normalmente não pedir uma corda para comparar duas outras uns com os outros - não tem nada a ver com a string original em si tem

.

Outras dicas

A partir do Javadoc Collections.sort:

Classifica a lista especificada em ordem crescente, de acordo com o ordenação natural de seus elementos. Todos os elementos na lista de must implementar a interface Comparable . Além disso, todos os elementos na lista deve ser mutuamente comparável (isto é, e1.compareTo (e2) não deve jogar uma ClassCastException para qualquer elemento E1 e E2 na lista).

Seus implementos classe Comparator, não é comparável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top