Класс LinkedList наследуется от класса AbstractSequentialList и реализует интерфейсы: List, Deque и Queue, то есть он может вести себя как простой список объектов с доступом через индекс (через интерфейс List), однонаправленная очередь (через интерфейс Queue) или двунаправленная очередь или стек (через интерфейс Deque). Физически объекты в данной коллекции хранятся в двунаправленном списке. Этот класс является также обобщенным и может содержать любые объекты. Этот класс имеет несколько методов которые логически делают схожие действия: добавляют элемент в начало или конец очереди, извлекают из начала или конца очереди. Часть из них в случае неудачи возвращает булевое значение а часть вызывает исключительную ситуацию.
class Coordinate{ private int X; private int Y;
public Coordinate(int X, int Y) { this.X = X; this.Y = Y; }
@Override public String toString() { return "X: " + X + ", Y: " + Y; }
@Override public boolean equals(Object obj) { if(obj instanceof Coordinate){ Coordinate c = (Coordinate)obj; return c.X == this.X && c.Y == this.Y; }else return super.equals(obj); } }
void CollectionToTextArea(LinkedList<Coordinate> c, JTextArea ta){ for(Coordinate item: c){ta.append(item.toString() + "\n"); } ta.append("--------------------------------------------------" + "\n"); }
void CoordinateToTextArea(Coordinate c, JTextArea ta, String comment){ if(c != null){ ta.append(comment + c.toString() + "\n"); } }
//выводим все содержимое очереди в текстовую область (при этом очередь очищается) void RemoveAllQueueElements(Queue <Coordinate> q){ Coordinate c = null; c = q.poll(); while(c != null) { jTextArea1.append("Удалили из очереди: " + c.toString() + "\n"); c = q.poll(); } }
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // создаем коллекцию координат и будем через разные интерфейсы работать с ней LinkedList<Coordinate> ll1 = new LinkedList<Coordinate>();
//работа с LinkedList как со списком через интерфейс List List list_itf = ll1; list_itf.add(new Coordinate(1, 1)); list_itf.add(0, new Coordinate(2, 2));
//работа с коллекцией как с однонаправленной очередью через интерфейс Queue Queue <Coordinate> q_itf = ll1; //добавляем элементы в очередь q_itf.offer(new Coordinate(3, 3)); q_itf.offer(new Coordinate(4, 4)); q_itf.offer(new Coordinate(5, 5)); //выводим в текстовую область всю коллекцию CollectionToTextArea(ll1, jTextArea1);
Coordinate c = null;
//element() возвращает элемент из головы очереди не удаляя его, если очередь пустая - будет ИС c = q_itf.element(); CoordinateToTextArea(c, jTextArea1, "element(): ");
//peek() возвращает элемент из головы очереди не удаляя его, если очередь пустая - вернет false c = q_itf.peek(); CoordinateToTextArea(c, jTextArea1, "peek(): ");
//remove() удаляет элемент из головы очереди и возвращает его, если очередь пустая - будет ИС c = q_itf.remove(); CoordinateToTextArea(c, jTextArea1, "remove(): ");
//poll() удаляет элемент из очереди и возвращает его, если очередь пустая - вернет null c = q_itf.poll(); CoordinateToTextArea(c, jTextArea1, "poll(): ");
//выталкиваем всю очередь в текстовую область RemoveAllQueueElements(q_itf); jTextArea1.append("Проверяем - очередь должна быть пустой \n"); CollectionToTextArea(ll1, jTextArea1);
//работа с коллекцией как двунаправленной очередью через интерфейс Deque //здесь возможна вставка и удаление с обоих концов очереди Deque <Coordinate> d_itf = ll1;
//вставляем в начало очереди addFirst() d_itf.addFirst(new Coordinate(4, 4)); d_itf.addFirst(new Coordinate(3, 3)); d_itf.addFirst(new Coordinate(2, 2)); d_itf.addFirst(new Coordinate(1, 1)); d_itf.addFirst(new Coordinate(0, 0)); //вставляем в начало очереди offerFirst() d_itf.offerFirst(new Coordinate(-1, -1)); d_itf.offerFirst(new Coordinate(-2, -2)); d_itf.offerFirst(new Coordinate(-3, -3));
//вставляем в конец очереди addLast() d_itf.addLast(new Coordinate(5, 5)); d_itf.addLast(new Coordinate(6, 6)); d_itf.addLast(new Coordinate(7, 7));
//вставляем в конец очереди offer() d_itf.offer(new Coordinate(8, 8)); d_itf.offer(new Coordinate(9, 9)); //вставляем в конец очереди offerLast() d_itf.offerLast(new Coordinate(10, 10)); d_itf.offerLast(new Coordinate(11, 11));
CollectionToTextArea(ll1, jTextArea1);
//удаляем элементы из начала очереди c = d_itf.removeFirst(); CoordinateToTextArea(c, jTextArea1, " удалили removeFirst(): "); c = d_itf.removeFirst(); CoordinateToTextArea(c, jTextArea1, " удалили removeFirst(): "); c = d_itf.removeFirst(); CoordinateToTextArea(c, jTextArea1, " удалили removeFirst(): ");
//удаляем элементы из конца очереди c = d_itf.removeLast(); CoordinateToTextArea(c, jTextArea1, " удалили removeLast(): "); c = d_itf.removeLast(); CoordinateToTextArea(c, jTextArea1, " удалили removeLast(): "); c = d_itf.removeLast(); CoordinateToTextArea(c, jTextArea1, " удалили removeLast(): "); c = d_itf.removeLast(); CoordinateToTextArea(c, jTextArea1, " удалили removeLast(): ");
//выводим коллекцию после удаления CollectionToTextArea(ll1, jTextArea1); //выталкиваем всю очередь в текстовую область (очищаем коллекцию) RemoveAllQueueElements(q_itf); //проверяем - коллекция пустая CollectionToTextArea(ll1, jTextArea1);
//работаем с коллекцией как со стеком через интерфейс Deque for(int i = 0; i < 100; i ++) d_itf.push(new Coordinate(i, i)); CollectionToTextArea(ll1, jTextArea1);
//выводим содержимое стека, так как pop() генерирует ИС если нет данных //то помещаем в блок try-catch try{ while(true){ c = d_itf.pop(); CoordinateToTextArea(c, jTextArea1, "достали из стека : "); } } catch(NoSuchElementException ex){ jTextArea1.append("Исключительная ситуация - переполнение стека \n"); }
//теперь протестируем итератор //вставляем в начало очереди addFirst() d_itf.addFirst(new Coordinate(4, 4)); d_itf.addFirst(new Coordinate(3, 3)); d_itf.addFirst(new Coordinate(2, 2)); d_itf.addFirst(new Coordinate(1, 1)); d_itf.addFirst(new Coordinate(0, 0)); Iterator <Coordinate> it1 = ll1.iterator(); jTextArea1.append("Тестируем итератор для последовательного перебора коллекции \n"); while(it1.hasNext()) {jTextArea1.append(it1.next().toString() + "\n"); }
}
|