Создание связанного списка с использованием Generics - PullRequest
1 голос
/ 06 апреля 2010

В настоящее время я усердно работаю над долгожданным заданием. Я должен сделать связанный список, используя дженерики. Или у меня есть интерфейс под названием Creature, который должен сортировать список. Но как? Как список может сортировать существ, если интерфейс не может иметь указатель Creature nextCreature? Я знаю, как создать связанный список, используя обычные объекты, но этот общий материал меня озадачил.

Это только очень малая часть задачи, но из-за этого я ничего не получаю.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

Ваша проблема в том, что вы застряли, думая, что каждый объект в связанном списке должен указывать на следующий (и, возможно, предыдущий) объект. Это не совсем верно. Что вам нужно сделать, это создать связанный список объектов, которые просто содержат другие объекты. Поэтому вместо того, чтобы пытаться выяснить, как изменить Существо, чтобы оно имело указатели, просто создайте связанный список универсальных объектов ListEntry, каждый из которых имеет ссылку (и) на другие ListEntrys и может также содержать некоторые для указания (универсальный тип T. Снаружи оно будет действовать так, как будто каждое Существо имеет ссылку (и) на других, но изнутри вы будете знать, что каждое Существо просто переносится объектом ListEntry. Это одна из вещей, которую они имеют в виду, когда говорят о инкапсуляции.

Кстати, именно так это и делается в платформе Java Collections.

3 голосов
/ 06 апреля 2010

Общий класс связанного списка обычно реализуется с использованием универсального вспомогательного класса для представления узла списка. Этот класс Node будет содержать элемент типа T (где T - универсальный параметр) и ссылку на следующий узел (типа Node<T>). Так бы это выглядело так:

class Node<T> {
    T element;
    Node<T> next;
};

В случае двусвязного списка, узел также будет содержать ссылку на предыдущий узел. Используя этот класс Node, вы сможете точно определить реализацию связанного списка (список будет просто содержать ссылку на первый узел (и последний узел для двусвязных списков), а затем определить операции со списками, работая с узлы).

1 голос
/ 06 апреля 2010

Сортировка обрабатывается автоматически, пока вы реализуете Comparable:

class Creature implements Comparable {
    public int compareTo(Object o) {
        return 0; // TODO: Your compare function here.
    }
}

class Ape extends Creature {}
class Elephant extends Creature {}

Затем вы можете создать общий список и отсортировать его следующим образом:

public static void main(String[] args) {
    LinkedList<Creature> creatures = new LinkedList<Creature>();
    Collections.addAll(creatures, new Elephant(), new Ape());
    Collections.sort(creatures);
}
0 голосов
/ 06 апреля 2010
public interface Creature {
    public void doSomething();
}

public class MyCreature implements Creature {
    public void doSomething() { }
}

и вы используете его в своем коде так:

List<Creature> genericList = new LinkedList<Creature>();
genericList.add(new MyCreature());
Creature c = genericList.get(0);
...