Сравнение элементов коллекций.
Интерфейс Comparator описывает два метода сравнения:
int compare(Object obji, object obj2 ) — возвращает отрицательное число, если objl в каком-то смысле меньше obj2 ; нуль, если они считаются равными; положительное число, если objl больше obj2;
boolean equals (Object obj) — сравнивает данный объект с объектом obj, возвращая true, если объекты совпадают в каком-либо смысле, заданном этим методом.
Для каждой коллекции можно реализовать эти два метода, задав конкретный способ сравнения элементов, и определить объект класса SortedMap вторым конструктором. Элементы коллекции будут автоматически отсортированы в заданном порядке.
Пример 4.5 показывает один из возможных способов упорядочения комплексных чисел — объектов класса Complex. Здесь описывается класс ComplexCompare, реализующий интерфейс Comparator.
Пример 4.5. Сравнение комплексных чисел
class Complex {
public double Re = 0.0;
public double Im = 0.0;
public Complex(){}
public Complex(double re, double im) { Re = re; Im = im; }
}
class ComplexCompare implements Comparator {
public int compare(Object objl, Object obj2) {
Complex z1 = (Complex)objl;
Complex z2 = (Complex)obj2;
if (z1.Re != z2.Re) return (int)(z1.Re > z2.Re ? 1 : -1);
else if (z1.Im != z2.Im) return (int)(z1.Im > z2.Im ? 1 : -1);
else return 0;
}
public boolean equals(Object z) {
return compare(this, z) == 0;
}
}
Классы, создающие множества. Класс HashSet полностью реализует интерфейс Set и итератор типа Iterator. Класс HashSet используется в тех случаях, когда надо хранить только одну копию каждого элемента.
В классе HashSet четыре конструктора:
HashSet() — создает пустой объект с показателем загруженности 0,75;
|
|
HashSet(int capacity) — создает пустой объект с начальной емкостью capacity и показателем загруженности 0,75;
HashSet(int capacity, float loadFactor) — создает пустой объект с начальной емкостью capacity и показателем загруженности loadFactor;
HashSet(Collection coll) — создает объект, содержащий все элементы коллекции coll, с емкостью, равной удвоенному числу элементов коллекции coll, но не менее 11, и показателем загруженности 0,75.
Упорядоченные множества. Класс TreeSet полностью реализует интерфейс SortedSet и итератор типа Iterator. Класс TreeSet реализован как бинарное дерево поиска, его элементы хранятся в упорядоченном виде. Это значительно ускоряет поиск нужного элемента.
Порядок задается либо естественным следованием элементов, либо объектом, реализующим интерфейс сравнения Comparator.
В классе TreeSet четыре конструктора:
TreeSet() — создает пустой объект с естественным порядком элементов;
TreeSet(Comparator с) — создает пустой объект, в котором порядок задается объектом сравнения с;
TreeSet(Collection coll) — создает объект, содержащий все элементы коллекции coll, с естественным порядком ее элементов;
TreeSet(SortedMap sf) — создает объект, содержащий все элементы отображения sf, в том же порядке.
В пример 4.6 показано, как можно хранить комплексные числа в упорядоченном виде. Порядок задается объектом класса ComplexCompare.
|
|
Пример 4.6. Хранение комплексных чисел в упорядоченном виде
TreeSet ts = new TreeSet(new ComplexCompare());
ts.add(new Complex(1.2, 3.4));
ts.add(new Complex(-1.25, 33.4));
ts.add(new Complex(1.23, -3.45));
ts.add(new Complex(16.2, 23.4));
Iterator it = ts.iterator();
while(it.hasNext()) {
Complex c = (Complex)it.next();
System.out.println("(" + c.Re + "; " + c.Im + ")");
}
Практические задания
1. Изучить особенности реализации классов-коллекций в Java.
2. Доработать программу, созданную в лабораторных работах № 2 - 3:
1) добавить генерируемым объектам понятия «время рождения» и «время жизни». Время рождения устанавливается в момент генерации объекта, и по значению соответствует времени, прошедшему от начала симуляции. Время жизни – время, через которое объект должен исчезнуть, считая от времени рождения;
2) вынести параметры времен жизни объектов в пользовательский интерфейс. Для каждого типа объекта должно задаваться собственное время. Рекомендуется использовать текстовые поля, но следуют помнить о проверке на ввод некорректных данных;
3) огранизовать коллекцию сгенерированных объектов по варианту. При генерации объекта происходит добавление его в коллекцию. При обновлении времени обойдите коллекцию и удалите все объекты, время жизни которых истекло;
|
|
4) добавить генерируемым объектам уникальные целочисленные идентификаторы (случайные числа), которые назначаются при генерации объекта. Для хранения сгенерированных идентификаторов используйте коллекцию удобную для поиска по варианту;
5) добавьте в панель управления кпопку «Текущие объекты». По нажатию на эту кнопку появляется модальное диалоговое окно, содержащее список всех «живых» объектов на момент нажатия со временем их рождения (время рождения – ключ). В класс диалогового окна должна передаваться коллекция с хранением объектов по времени рождения. Типы коллекций задаются вариантом.
Вариант 1
Коллекция для хранения объектов: Vector
Коллекция для хранения и поиска уникальных идентификаторов: HashSet
Коллекция для хранения объектов по времени рождения: TreeMap
Вариант 2
Коллекция для хранения объектов: ArrayList
Коллекция для хранения и поиска уникальных идентификаторов: HashSet
Коллекция для хранения объектов по времени рождения: TreeMap
Вариант 3
Коллекция для хранения объектов: LinkedList
Коллекция для хранения и поиска уникальных идентификаторов: HashSet
Коллекция для хранения объектов по времени рождения: TreeMap
|
|
Вариант 4
Коллекция для хранения объектов: Vector
Коллекция для хранения и поиска уникальных идентификаторов: TreeSet
Коллекция для хранения объектов по времени рождения: HashMap
Вариант 5
Коллекция для хранения объектов: ArrayList
Коллекция для хранения и поиска уникальных идентификаторов: TreeSet
Коллекция для хранения объектов по времени рождения: HashMap
Вариант 6
Коллекция для хранения объектов: LinkedList
Коллекция для хранения и поиска уникальных идентификаторов: TreeSet
Коллекция для хранения объектов по времени рождения: HashMap
Вариант 7
Коллекция для хранения объектов: Vector
Коллекция для хранения и поиска уникальных идентификаторов: HashSet
Коллекция для хранения объектов по времени рождения: HashMap
Вариант 8
Коллекция для хранения объектов: ArrayList
Коллекция для хранения и поиска уникальных идентификаторов: HashSet
Коллекция для хранения объектов по времени рождения: HashMap
Вариант 9
Коллекция для хранения объектов: Vector
Коллекция для хранения и поиска уникальных идентификаторов: TreeSet
Коллекция для хранения объектов по времени рождения: TreeMap
Вариант 10
Коллекция для хранения объектов: ArrayList
Коллекция для хранения и поиска уникальных идентификаторов: TreeSet
Коллекция для хранения объектов по времени рождения: TreeMap
Вопросы для самопроверки
1. Для чего используются классы-коллекции?
2. Что такое класс Vector? Для чего он используется? Каковы его достоинства и недостатки? Какая структура данных используется в классе Vector?
3. Назовите особенности организации класса Stack.
4. Для чего применяется класс Hashtable? Какая структура данных используется в классе Hashtable?
5. Что такое коэффициент загруженности?
6. Что такое емкость класса-коллекции?
7. Назначение и особенности применения класса Properties.
8. Расскажите об иерархии интерфейсов коллекций Java. Объясните назначение каждого интерфейса.
9. Каково назначение интерфейса Collection?
10. Опишите возможности применения интерфейсов Map, Set и List.
11. Для чего применяются интерфейсы Iterator и ListIterator?
12. Опишите классы ArrayList и LinkedList.
13. Опишите классы HashSet, TreeSet.
14. Опишите классы HashMap, TreeMap.
15. Какие структуры данных используются в этих классах?
16. Какие алгоритмы для обработки коллекций существуют в Java и как их использовать?
Дата добавления: 2018-04-15; просмотров: 421; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!