Содержание

Семинар 4

Классы и интерфейсы в языке Java могут быть шаблонными (generic), т.е. иметь типовые параметры. При создании объекта такого класса нужно указывать конкретные значения его типовых параметров.

Пример использования generic-ов: классы, предназначенные для хранения упорядоченной пары и упорядоченной тройки объектов

public class TwoTuple<A,B> {
	public final A first;
	public final B second;
	public TwoTuple(A a, B b) { first = a; second = b; }
	public String toString() {
		return "(" + first + ", " + second + ")";
	}
}
 
public class ThreeTuple<A,B,C> extends TwoTuple<A,B> {
	public final C third;
	public ThreeTuple(A a, B b, C c) {
		super(a, b);
		third = c;
	}
	public String toString() {
		return "(" + first + ", " + second + ", " + third +")";
	}
}

Пример работы с этими классами:

TwoTuple<Integer, String> tuple0 = new TwoTuple<Integer, String>(new Integer(10), "text");
System.out.println(tuple0.toString()); // напечатается (10, text)
ThreeTuple<Integer, String, Double> tuple1 = new ThreeTuple<Integer, String, Double>(new Integer(10), "text", new Double(0.1));
System.out.println(tuple1.toString()); // напечатается (10, text, 0.1)

Задание 4.1

Приведем одну из возможных реализаций двусвязного списка:

public class MyLinkedList<E> {
	private static class Node<E>{
		E element = null;
		Node<E> next = null;
		Node<E> previous = null;
 
		Node (E element){
			this.element = element;
		}
	}
 
	private Node<E> head = null;
	private Node<E> tail = null;
 
	private int size = 0;
 
	public void addLast(E element){// добавляет новый элемент в конец списка
		Node<E> tmpNode = new Node<E>(element);
		if(tail == null){
			head = tmpNode;
			tail = head;
		} else{
			tail.next = tmpNode;
			tmpNode.previous = tail;
			tail = tmpNode;
		}
	}
 
	public String toString(){// "преобразует" список в строку
		if(head == null)
			return null;
 
		Node<E> tmpNode = head;
		String tmpString = "[" + tmpNode.element.toString();
 
		while (tmpNode != tail){
			tmpNode = tmpNode.next;
			tmpString = tmpString.concat(", " + tmpNode.element.toString());
		};
		tmpString = tmpString.concat("]");
 
		return tmpString;
	}
}

Пример использования:

MyLinkedList<Integer> list = new MyLinkedList<Integer>();
for (int i = 0; i < 10; i++)
	list.addLast(new Integer(i));
System.out.println(list.toString());// напечатается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Допишите следующие методы:

  1. Добавление нового элемента в начало списка.
  2. Удаление первого/последнего элемента.
  3. Получение значения первого/последнего элемента.
  4. Получение размера списка.
  5. Получение значения i-го элемента списка.
  6. Удаление i-го элемента списка.

Указание к оформлению решения

Новые методы должны называться в соответствии с методами класса java.util.LinkedList<E>.

Задание 4.2

С помощью получившегося двусвязного списка напишите решение задачи Иосифа Флавия.

Следующий семинар >>>