В этой серии статей я продемонстрирую один из способов реализации интерфейса 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 который в следующей части реализуем.
Немає коментарів:
Дописати коментар