2011-06-15 18 views
6

Estoy implementando una lista ordenada utilizando listas vinculadas. Mi clase de nodo tiene este aspecto¿Cómo comparar nodos genéricos en una lista vinculada usando Comparable?

public class Node<E>{ 
    E elem; 
    Node<E> next, previous; 
} 

En la clase de lista ordenada tengo el método add, donde tengo que comparar objetos genéricos en base a la aplicación de compareTo() métodos, pero me da este error de sintaxis "El el método compareTo (E) no está definido para el tipo E ". He intentado implementar el método compareTo en Node, pero luego no puedo llamar a ninguno de los métodos del objeto, porque E es de tipo genérico. Aquí está el cuerpo no terminado del método add (E elem).

public void add(E elem) 
{ 

     Node<E> temp = new Node<E>(); 
     temp.elem = elem; 

     if(isEmpty()) {   
      temp.next = head; 
      head.previous = temp; 
      head = temp; 
      counter++; 
     }else{ 
      for(Node<E> cur = head; cur.next != null ; cur= cur.next) { 
       **if(temp.elem.comparTo(cur.elem)) {** 
        //do the sort; 

       }/*else{ 
        cur.previous = temp; 
       }*/    
      } 
      //else insert at the end 

     } 
} 

Aquí es uno de los objetos implemnting método compareTo

public class Patient implements Comparable<Patient>{ 
    public int compareTo(Patient that) 
    { 
     return (this.getPriority() <= that.getPriority() ? 1 : 0); 
    } 
} 
+0

chicos, gracias por la pista comparables. Ahora, después de hacer estos cambios, me sale este error "desajuste Bound: El tipo E no es un sustituto válido para el parámetro acotado > del tipo \t Nodo " en esta línea Nodo temp = nuevo nodo (); temp.elem = elem; – hash

Respuesta

6

Bound E para Comparable:

public class Node<E extends Comparable<E>>{ 
    E elem; 
    Node<E> next, previous; 
} 

Compilará ahora.

+0

Hmmm ... parece familiar de alguna manera;) – Waldheinz

3

Parece que su genérico E debe ser E extends Comparable<E>. De esta forma, tendrá acceso al método compareTo(E other). Sin embargo, no podrá agregar elementos que no estén implementando esta interfaz.

3

Si desea que los elementos almacenados en los nodos que sean comparables, se puede afirmar esto utilizando genéricos:

public class Node<E extends Comparable<E>> { 

    E elem; 
    Node<E> next, previous; 
} 

esta manera es seguro, que cada E implementa la interfaz Comparable, por lo que se puede llamar de forma segura el método compareTo.

+0

Hmmm ... parece familiar de alguna manera :) – Bohemian

+0

¿Significa que la clase del paciente necesita implementar Nodo como interfaz? – hash

+1

Solo tiene que implementar la interfaz 'Comparable ', lo que significa que debe implementar un método 'compareTo (Patient other)'. – Waldheinz

2

Trate

public class Node<E extends Comparable<E>>{ 
    E elem; 
    Node<E> next, previous; 
} 
Cuestiones relacionadas