2012-05-06 4 views
0

Я быстро написал класс связанного списка в Java. Я хочу написать еще один класс очереди, который использует связанный список. Как я могу достичь этого в Java? Я не совсем понимаю, орудия/расширяет ключевые слова ... это то, что моя очередь выглядит как (например):Очередь с использованием реализации связанного списка в Java

public class Queue<T> implements LinkedList 
{ 
    protected LinkedList<T> list; 

    public Queue() { 
     list = new LinkedList<T>(); 
    } 

    public void add(T element) { 
     list.add(element); 
    } 

    public T removeLast() { 
     return list.removeLast(); 
    } 
} 

отметить также, что связанный класс списка также родовой. Я знаю, что для достижения этой функциональности уже созданы классы, но я хотел узнать (именно поэтому я пытаюсь это сделать вручную)

EDIT: Кроме того, в конце концов, я хотел бы иметь возможность сказать что-то вроде этого:

Queue<String> aQueue = new LinkedList<String>(); 
+2

вы знаете о дженериков, но не о 'инвентарь/extends'? Шутки в сторону ? –

+0

@SoboLAN Я предполагаю, что он находится на этапе обучения: «Я быстро написал класс связанных списков в Java», не используя общий LinkedList. –

+0

yes - см. Мое сообщение «Я знаю, что для этой функции уже созданы классы, но я хотел узнать (именно поэтому я пытаюсь сделать это вручную)» – Tim

ответ

6

Если вы хотите поведение как Queue<String> aQueue = new LinkedList<String>(); то ваш LinkedList должен расширить/реализовать Queue класс/интерфейс. Помните, что суперкласс может быть экземпляром объекта сравнения подкласса, а не наоборот.

public class LinkedList<T> implements Queue<T> { 

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

    //all your behavior here 
} 

Кроме того, как сказано в документации Java, Queue является интерфейсом и LinkedList реализует его.

Примечание. Если вы хотите реализовать очередь с помощью LinkedList, вы должны увидеть образец кода, отправленный @Tudor.

+0

hmm Я думаю, что это именно то, что я ищу .. собирается проверить его быстро, спасибо. – Tim

+0

@Tim Добро пожаловать –

+0

, так что если я объявляю очередь в качестве интерфейса. Например: 'public interface Queue {// Методы}' Эти методы не должны иметь тело функции, но должны просто иметь то же имя, что и соответствующий метод в классе LinkedList? – Tim

2

Две ошибки в коде:

  1. вы оба реализации LinkedList (вы имели в виду расширить?) и с использованием композиции, имея LinkedList внутри вашего класса.

  2. Этот фрагмент кода не будет работать: Queue<String> aQueue = new LinkedList<String>();, потому что в соответствии с пунктом 1, Queue либо подкласс LinkedList или содержит LinkedList, что делает ваш код неверен.

Фактически, последний фрагмент кода имеет мало смысла. Я предполагаю, что то, что вы хотите сделать, это создать Queue, который внутренне использует связанный список. В этом случае просто использовать:

public class Queue<T> 
{ 
    protected LinkedList<T> list; 

    public Queue() { 
     list = new LinkedList<T>(); 
    } 

    public void add(T element) { 
     list.add(element); 
    } 

    public T removeLast() { 
     return list.removeLast(); 
    } 
} 

И потом:

Queue<String> queue = new Queue<String>(); 
+0

ok, так что я могу сделать, чтобы сделать «Queue aQueue = new LinkedList (); 'работа? Если я удалю «implements linkedList» из класса очереди, это исправит? Я собираюсь проверить это тем временем ... Хорошо, я просто попробовал ... он говорит «несовместимые типы» (вот почему я в первую очередь ставил «инструменты ...») – Tim

+0

@Тим: см. Мой редактировать. – Tudor

+0

круто, что решает одну проблему ... спасибо:) ...причина, по которой я хотел получить этот последний фрагмент, заключалась в том, что в моей одной программе я создаю некоторые связанные списки с объектами другого класса ... и я хочу, чтобы иметь возможность скопировать этот связанный список в очередь – Tim

-1

Поскольку LinkedList реализует интерфейс очереди можно использовать опрос, не выглядывать методы непосредственно .... нет необходимости дополнительного кода

Смежные вопросы