Как сравнить общие узлы в связанном списке с помощью Comparable?

Я реализую отсортированный список, используя связанные списки. Мой класс узла выглядит так

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

В классе отсортированного списка у меня есть метод добавления, где мне нужно сравнить общие объекты на основе их реализации методов compareTo(), но я получаю эту синтаксическую ошибку «Метод compareTo (E) не определен для типа E». Я попытался реализовать метод compareTo в Node, но тогда я не могу вызвать ни один из методов объекта, потому что E является универсальным типом. Вот незавершенное тело метода 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

        }
}

Вот один из объектов, реализующих метод compareTo.

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

person hash    schedule 15.06.2011    source источник
comment
Спасибо, ребята, за сравнительную подсказку. Теперь, после внесения этих изменений, я получаю эту ошибку Несоответствие границ: тип E не является допустимой заменой для ограниченного параметра ‹E extends Comparable‹E›› типа Node‹E› в этой строке Node‹E› temp = new Узел‹E›(); темп.элемент = элемент;   -  person hash    schedule 15.06.2011


Ответы (4)


Связанный E с Comparable:

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

Сейчас он скомпилируется.

person Bohemian♦    schedule 15.06.2011
comment
Ммм... как-то знакомо ;) - person Waldheinz; 15.06.2011

Если вы хотите, чтобы элементы, хранящиеся в ваших узлах, были сопоставимы, вы можете указать это с помощью дженериков:

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

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

таким образом, каждый E реализует интерфейс Comparable, поэтому вы можете безопасно вызывать метод compareTo.

person Waldheinz    schedule 15.06.2011
comment
Ммм... как-то знакомо :) - person Bohemian♦; 15.06.2011
comment
Означает ли это, что класс пациента должен реализовать Node как интерфейс? - person hash; 15.06.2011
comment
Он должен реализовать только интерфейс Comparable<Patient>, что означает, что вам нужно реализовать метод compareTo(Patient other). - person Waldheinz; 15.06.2011
comment
Нет. Пациент — это сопоставимый узел. Пациент не должен и не должен знать о Node. - person Bohemian♦; 15.06.2011
comment
Спасибо Богемский, я так и думал. Но теперь я получаю ошибку несоответствия привязки плюс эту ошибку старого метода :( - person hash; 15.06.2011
comment
Вот код, жалующийся на несоответствие границ public void add(E elem, int priority) { Node‹E› temp = new Node‹E›(); темп.элемент = элемент; - person hash; 15.06.2011
comment
@Bohemian: Ты тоже. И Sorrow также заслуживает +1, потому что вы не сможете добавлять элементы... что тоже важно упомянуть. - person Waldheinz; 15.06.2011

Кажется, что ваш общий E должен быть E extends Comparable<E>. Таким образом вы получите доступ к методу compareTo(E other). Однако вы не сможете добавлять элементы, которые не реализуют этот интерфейс.

person Miki    schedule 15.06.2011

Пытаться

public class Node<E extends Comparable<E>>{
    E elem;
    Node<E> next, previous;
}
person Dorus    schedule 15.06.2011