В этом уроке мы реализуем интерфейс List семейства Collection на основе двунаправленной очереди.
Приступим к реализации List. За основное хранилище будем использовать очередь Node.java
которую мы сделали в предыдущем уроке.
Обратите внимание на переменную size
:
private int size = 0;
Она будет хранить текущий размер коллекции, по умолчанию ноль (0).
Теперь реализуем методы, которые связаны с переменной size.
@Override public int size() { return this.size; } @Override public boolean isEmpty() { return size() == 0; }
size()
- Возвращает размер списка.
isEmpty()
- Возвращает true, если этот список пустой и false если в списке есть хотя бы один элемент.
Дальше в реализации методов лучше использовать не переменную size
, а метод size()
, как показано в методе isEmpty()
.
Теперь в классе MyImplList
переименуем переменную node
на previous
и добавим еще одну с именем next
:
private Nodeprevious; private Node next;
Теперь реализуем метод добавление элемента в наш список, но для его реализации нам потребуется еще одна переменная.
private Nodefirst;
С ей помощью мы будем знать начало списка.
@Override public boolean add(E e) { Nodenode = new Node (e); if (first == null) { first = node; } else { previous = first; } if (size() == 1) { first.setNext(node); } size++; return true; }
add()
- Добавляет элемент в конец списка и в случае удачного добавления элемента возвращает true.
Теперь создадим метод который позволит нам получать элемент очереди по индексу.
private NodegetByIndex(int index) { Node node = null; if (!isEmpty() && (index >= 0 && index < size)) { node = first; for(int i=1; i<=index; i++){ node = node.getNext(); } } return node; }
И с его помощью реализуем метод get()
:
@Override public E get(int index) { E element; if (index >= 0 && index < size()) { element = getByIndex(index).getT(); } else throw new IndexOutOfBoundsException(); return element; }
get()
- Возвращает элемент в указанной позиции в этом списке.
@Override public boolean contains(Object o) { for (int i = 0; i < size(); i++) { if (get(i).equals(o)) return true; } return false; }
contains(Object o)
- Возвращает true, если этот список содержит указанный элемент.
@Override public Object[] toArray() { Object[] array = new Object[size]; for (int i = 0; i < size; i++) { array[i] = getByIndex(i).getT(); } return array; }
toArray()
- Возвращает массив, содержащий все элементы в этом списке в правильной последовательности.
Для реализации метода remove()
нам потребуется переопределить метод equals()
в классе Node
:
@Override public boolean equals(Object obj) { return t.equals(obj); }
@Override public boolean remove(Object o) { Nodenode = first; for (int i = 0; i < size(); i++) { if (node.equals(o)) { node.getPrevious().setNext(node.getNext()); return true; } } return false; }
remove()
- Удаляет первое вхождение указанного элемента из этого списка, если он присутствует и возвращает true если он удален.
Немає коментарів:
Дописати коментар