Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Java / Лабы / lab6

.pdf
Скачиваний:
58
Добавлен:
15.03.2015
Размер:
218.5 Кб
Скачать

Лабораторная работа 6 ОБОБЩЕННОЕ ПРОГРАММИРОВАНИЕ

Цель лабораторной работы

Получить представление об основных принципах обобщенного программирования.

Задание на лабораторную работу

В лабораторной работе требуется добавить к стеку, написанному в лабораторных работах №5 и №6 возможность хранения не только целочисленных значений, но и любых объектов, которые можно сравнивать между собой. Для этого необходимо написать стек, содержащий в качестве полей два экземпляра стека, написанного ранее. Один из этих внутренних стеков хранит добавляемые элементы, другой в любой момент времени содержит в своей вершине минимальный из всех, находящихся в первом стеке элементов. При добавлении элемента во внешний стек он должен добавляться в первый внутренний стек и сравниваться с элементом, находящимся в вершине второго внутреннего стека. Если добавляемый элемент не превосходит его или во втором стеке нет ни одного элемента, этот элемент добавляется также и во второй стек. В противном случае во второй стек добавляется тот же элемент, что и находящийся в данный момент в его вершине. При удалении элемента из вершины внешнего стека элементы из вершин обоих внутренних стеков удаляются. Кроме того внешний стек должен предоставлять возможность получать значение, хранящееся в вершине первого внутреннего стека (метод peek), а также значение, хранящееся в вершине второго внутреннего стека (метод getMin).

Все стеки должны иметь обобщенный параметр и инстанцироваться любым классом, реализующим интерфейс Comparable.

Указания к выполнению лабораторной работы

Язык Java имеет механизм обобщенного программирования. Обобщенное программирование позволяет реализовывать классы, обладающие одинаковой логикой обработки данных, независимо от того, с данными какого типа они должны работать. Например, класс Foo имеет обобщенный параметр E.

public class Foo<E> { private E value;

public void setValue(E value) { this.value = value;

}

public E getValue() { return value;

}

}

Класс Foo можно использовать следующим образом:

Foo<Integer> integerFoo = new Foo<Integer>(); integerFoo.setValue(42); System.out.println(integerFoo.getValue()); Foo<String> stringFoo = new Foo<String>(); stringFoo.setValue("Some string"); System.out.println(stringFoo.getValue());

При этом Foo<Integer> и Foo<String> – разные типы. Однако, благодаря обобщенному программированию не требуется переписывать один и тот же код, если он должен работать с данными другого типа.

Для сравнения объектов, которые можно упорядочить по возрастанию, в Java предназначен интерфейс Comparable. Он объявлен следующим образом: public interface Comparable<T> {

public int compareTo(T o);

}

Здесь T – тип объектов, для которых возможно сравнение. Единственный метод compareTo сравнивает текущий объект с объектом o и возвращает отрицательное число, если объект, для которого вызван compareTo, меньше, чем объект o, положительное число, если больше, ноль, если они равны.

Можно модифицировать класс Foo, чтобы он устанавливал новое значение только в том случае, если оно меньше текущего. Поскольку, теперь в качестве параметра E можно использовать только класс, реализующий интерфейс Comparable, обобщенный параметр должен иметь вид <E extends Comparable<E>>.

public class Foo<E extends Comparable<E>> { private E value;

public Foo(E newValue) { value = newValue;

}

public void setValue(E newValue) {

if (value.compareTo(newValue) > 0) { value = newValue;

}

}

public E getValue() { return value;

}

}

Интерфейс Comparable реализован во всех стандартных классах Java,

таких как Integer, Double, String и т.д.

Результат выполнения лабораторной работы

В результате выполнения лабораторной работы должны быть написаны следующие классы:

DoubleStack<E extends Comparable<E>> – внешний стек.

Stack<E extends Comparable<E>> – внутренний стек, написанный в лабораторных работах №4 и №5 с обобщенным типом элемента.

Код, использующий стек, для разных классов, реализующий интерфейс Comparable.

Соседние файлы в папке Лабы