В этой серии статей я продемонстрирую один из способов реализации интерфейса List. Для реализации мы будем использовать двунаправленную очередь.
1. Начнем с теории.
Рассмотрим схему двунаправленной очереди:
next
— это указатель на следующий элемент очереди.previous
— это указатель на предыдущий элемент очереди.item
- текущий элемент очереди.
Теперь разберемся, что же тут происходит.
Первый элемент очереди хранит какой то item и ссылки на следующий и предыдущий элемент. Так как в примере 3 элемента в очереди, то в первом элементе next хранит адрес следующего элемента. Но если бы у нас в очереди был только один элемент, тогда next был бы равен NULL.
Второй элемент так же имеет item и next который хранит адрес следующего элемента, previous который хранит адрес предыдущего элемента.
Вот по такой вот схеме мы будем работать при реализации List
.
2. Создание элемента очереди.
Создадим класс который будет называться Node.java
:
package com.devcolibri.list; public class Node{ private Node next; private Node previous; private T t; public Node() { this.next = null; this.previous = null; } public Node(Node previous) { this.next = null; this.previous = previous; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public Node getPrevious() { return previous; } public void setPrevious(Node previous) { this.previous = previous; } public T getT() { return t; } public void setT(T t) { this.t = t; } }
Node next
— тут мы будем хранить адрес следующего элемента коллекции;
Node previous
- тут мы будем хранить адрес предыдущего элемента коллекции;
T t
— это наш item;
int index
— тут индекс текущего элемента коллекции.
Теперь создадим класс который реализует интерфейс List
.
package com.devcolibri.list; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class MyImplListimplements List { private Node node; private int size = 0; public MyImplList() { this.node = new Node (); } @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public Iterator iterator() { return null; } @Override public Object[] toArray() { return new Object[0]; } @Override public T[] toArray(T[] a) { return null; } @Override public boolean add(E e) { return false; } @Override public boolean remove(Object o) { return false; } @Override public boolean containsAll(Collection c) { return false; } @Override public boolean addAll(Collection c) { return false; } @Override public boolean addAll(int index, Collection c) { return false; } @Override public boolean removeAll(Collection c) { return false; } @Override public boolean retainAll(Collection c) { return false; } @Override public void clear() { } @Override public E get(int index) { return null; } @Override public E set(int index, E element) { return null; } @Override public void add(int index, E element) { } @Override public E remove(int index) { return null; } @Override public int indexOf(Object o) { return 0; } @Override public int lastIndexOf(Object o) { return 0; } @Override public ListIterator listIterator() { return null; } @Override public ListIterator listIterator(int index) { return null; } @Override public List subList(int fromIndex, int toIndex) { return null; } }
Хочу обратить ваше внимание на то что в данном примере мы просто указали что класс MyImplList
реализует List
, после чего мы определили все методы интерфейса List
который в следующей части реализуем.
Немає коментарів:
Дописати коментар