Лабораторная работа 4 Коллекции объектов
Скачать 152.03 Kb.
|
Лабораторная работа 4 Коллекции объектовКоллекцииКоллекции – это контейнеры, в которых можно хранить условно однотипные* объекты. Отличия от массивов:
*Элементы коллекции должны иметь одинаковый базовый классОсновные типы коллекций
Иерархия классов коллекцийБазовый интерфейс CollectionОсновные операции:
IteratorИтератор используется для того, чтобы получить доступ к элементам коллекции. Итератор можно получить из любой коллекции, вызвав у нее метод iterator().Iterator содержит следующие методы:boolean hasNext()E next()void remove()Однако, в большинстве случаев удобнее пользоваться циклом foreach для перебора элементов коллекции. Итератор стоит использовать тогда, когда нужно удалить какой-либо элемент. Если попробовать удалить его в цикле, программа, скорее всего, выдаст ошибку и аварийно завершит работу.Java.util.ListList
Основные операции:E get(int index)E set(int index, E element)void add(int index, E element)E remove(int index)int indexOf(Object o)int lastIndexOf(Object o) List |
Выбрасывает исключение | Возвращает значение | |
Вставка элемента | add(e) | offer(e) |
Удаление элемента | remove() | poll() |
Получение элемента | element() | peek() |
Пример Queue
Queue qc = new LinkedList();
for (char c : "Dinosaurus".toCharArray())
qc.offer(c);
while(qc.peek() != null)
System.out.print(qc.remove()+" ");
// Output: D i n o s a u r u s
Сделать задания 1, 2, 3
java.util.Map
Map
Карта отображает одни объекты на другие. По сути это ассоциативный массив, в котором доступ к объекту можно получить зная его ключ (набор пар «ключ-значение»). Map – это интерфейс и он НЕ реализует интерфейс collection, в отличие от всех остальных типов коллекций (см схему на 4 слайде). Для того, чтобы начать работать с картной, необходимо создать объект одного из классов: HashMap, LinkedHashMap, TreeMap или HashTable.Основные операции, описанные в Map
- int size()
- boolean isEmpty()
- V get(Object key)
- V put(K key, V value)
- V remove(Object key)
- boolean containsKey(Object key)
- boolean containsValue(Object key)
- Set
keySet() - Collection
values() - Set
> entrySet()
HashMap и LinkedHashMap
Особенности:
- Реализация ассоциативного массива на основе хеш-таблицы
- Порядок обхода элементов непредсказуем (HashMap) либо обусловлен порядком вставки (LinkedHashMap)
Map planets = new HashMap();
// Autoboxing: автоматическая упаковка примитивных типов в
// классы-обертки (в данном случае int -> Integer)
planets.put(“Mercury", 58);
planets.put(“Venus", 108);
planets.put(“Earth", 150);
planets.put(“Mars”, 228);
int distanceToSun = planets.get(“Earth");
Пример работы с Map
Map vehicles = new HashMap();
vehicles.put("BMW", 250);
vehicles.put("Mercedes", 235);
vehicles.put("Audi", 245);
vehicles.put(“Lada", 170);
vehicles.remove(“Lada“);
System.out.println("Total vehicles: " + vehicles.size());
// Получаем множество ключей и перебираем коллекцию
for (String key : vehicles.keySet())
System.out.println(key + " - " + vehicles.get(key));
System.out.println();
// Ищем элемент с ключем “Audi”
String searchKey = "Audi";
if (vehicles.containsKey(searchKey))
System.out.println(searchKey+" max speed is”+vehicles.get(searchKey)+”km/h");
// Удаляем все элементы
vehicles.clear();
TreeMap
Особенности:
- Реализация ассоциативного массива на основе дерева поиска
- Элементы хранятся отсортированными по ключу
SortedMap treeMap = new TreeMap();
treeMap.put("Bruce", "Willis");
treeMap.put("Arnold", "Schwarzenegger");
treeMap.put("Jackie", "Chan");
treeMap.put("Sylvester", "Stallone");
treeMap.put("Chuck", "Norris");
for (Map.Entry e : treeMap.entrySet())
System.out.println(e.getKey() + " " + e.getValue());
Output:
Arnold Schwarzenegger
Bruce Willis
Chuck Norris
Jackie Chan
Sylvester Stallone
Сортировка карт
Чтобы отсортировать карту по ключам*, необходимо:
- Изначально использовать карту TreeMap (при этом конструктору можно передать собственную реализацию интерфейса Comparator)
- Создать новую карту TreeMap и передать ей в конструктор существующую коллекцию. Пример:
Map vehicles = new HashMap();
vehicles.put("BMW", 250);
vehicles.put("Mercedes", 235);
vehicles.put("Audi", 245);
System.out.println(vehicles); // Output: {Audi=4, BMW=5, Mercedes=3}
SortedMap sortedVechicles = new TreeMap(vehicles);
System.out.println(sortedVechicles); //Output: {Audi=4, BMW=5, Mercedes=3}
* По значениям карту можно отсортировать только вручную
Методы обхода ассоциативного массива
Map map = new HashMap();
1) for (A key : map.keySet()) { … }
2) for (B value : map.values()) { … }
3) for (Map.Entry entry : map.entrySet()) {
entry.getKey();
entry.getValue();
}
Сравнение коллекций
Для сравнения используется метод equals(Object o):
- Списки равны, если содержат равные элементы в одинаковом порядке
- Множества равны, если содержат одинаковые элементы
- Карты (ассоциативные массивы) равны, если содержат одинаковые пары «ключ-значение»
List firstList = new ArrayList();
// add elements...
List secondList = new ArrayList();
// add elements...
if (firstList.equals(secondList))
System.out.println("Collections are equal!");
Пример создания составных коллекций
// Список
List arrayList = new ArrayList();
// Карта, в которой ключом является объект String, а значением - список
Map> innerMap = new HashMap>();
// Список, элементами которого являются карты, в которых ключом являются
// объекты типа String, а значением – список
List
new ArrayList
arraylist.add("Text");
innerMap.put("key", arraylist);
listOfMaps.add(innerMap);
// Извлекаем…
String text = listOfMaps.get(0).get("key").get(0);
System.out.println("Таки извлекли: "+ text);
Параметризованные классы (Generics)
class GenericClass {
private T item;
T getItem() {
return item;
}
void setItem(T item) {
this.item = item;
}
}
// Создаем экземпляр класса
GenericClass gc = new GenericClass();
gc.setItem("Some string"); // T -> String
System.out.println(gc.getItem()); //Output: Some string
gc.setItem(42); // T -> Integer
System.out.println(gc.getItem()); //Ouput: 42
Параметризованные методы
static void fromArrayToCollection(T[] a, Collection c) {
for (T element : a) c.add(element);
}
// Вызываем метод fromArrayToCollection()
String[] strArr = new String[10];
Collection objColl = new ArrayList();
fromArrayToCollection(strArr, objColl); // T -> String
Integer[] intArr = new Integer[10];
Double[] doubleArr = new Double[10];
Collection numColl = new ArrayList();
fromArrayToCollection(intArr, numColl); // T -> Integer
fromArrayToCollection(doubleArr, numColl); // T -> Double
Еще один пример с параметризованными типами
class Parent {
…
}
class Child extends Parent {
…
}
List
list = new ArrayList(); // Ошибка!
List extends Parent> list = new ArrayList(); //ОК
Сделать задания 4, 5
Задания
1. Создайте класс Student, содержащий закрытые поля name, age, averageScore, конструктор, который инициализирует эти поля и get- методы для получения значений этих полей. В методе main() создайте список List с типомЗадания
4. Создать карту Map, содержащую данные любых типов. Вывести все ключи. Вывести все значения. Программа должна предлагать ввести ключ и выводить на экран значение, соответствующее этому ключу, затем наоборот: предлагать ввести значение и выдавать ключ. Если в коллекции нет такого ключа или значения, программа должна выдавать соответствующие уведомления. 5. Создать метод printArray(), который получает массив любого типа (кроме примитивных типов) и выводит на экран каждый элемент. Аналогично создать метод printCollection(). В методе main() создать несколько массивов и коллекций различных типов и вывести на экран их элементы при помощи созданных методов.Домашнее задание
- Создать класс Planet, содержащий закрытые поля distanceToSun, mass и diameter, конструктор, который инициализирует эти поля (расстояние до солнца, масса и диаметр) и get- и set-методы для этих полей. Создать карту Map
, который будет содержать название планеты и класс с информацией о ней. Добавить в карту несколько планет (в коде, а не с клавиатуры). Программа должна предлагать ввести имя планеты и выдавать информацию о ней. Если такой планеты нет в списке, программа должна выдавать соответствующее сообщение. - Сделать то же самое, что и в предыдущей задаче, но информация о планете должна храниться в элементах списка. То есть коллекция должна быть примерно такой: Map
>.