русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Вывод содержимого контейнеров


Дата добавления: 2015-06-12; просмотров: 1120; Нарушение авторских прав


Для получения печатного представления массива необходимо использовать метод Arrays.toString, но контейнеры отлично выводятся и без посторонней помощи. Следующий пример демонстрирует использование основных типов контейнеров:

//: holding/PrintingContainers.java

// Вывод контейнеров по умолчанию

import java.util.*;

import static net.mindview.util.Print.*;

 

public class PrintingContainers {

static Collection fill(Collection<String> collection) {

collection.add("rat");

collection.add("cat");

collection.add("dog");

collection.add("dog");

return collection;

}

static Map fill(Map<String,String> map) {

map.put("rat", "Fuzzy");

map.put("cat", "Rags");

map.put("dog", "Bosco");

map.put("dog", "Spot");

return map;

}

public static void main(String[] args) {

print(fill(new ArrayList<String>()));

print(fill(new LinkedList<String>()));

print(fill(new HashSet<String>()));

print(fill(new TreeSet<String>()));

print(fill(new LinkedHashSet<String>()));

print(fill(new HashMap<String,String>()));

print(fill(new TreeMap<String,String>()));

print(fill(new LinkedHashMap<String,String>()));

}

}

<spoiler text="Output:">

[rat, cat, dog, dog]

[rat, cat, dog, dog]

[dog, cat, rat]

[cat, dog, rat]

[rat, cat, dog]

{dog=Spot, cat=Rags, rat=Fuzzy}

{cat=Rags, dog=Spot, rat=Fuzzy}

{rat=Fuzzy, cat=Rags, dog=Spot}

</spoiler> Как уже было упомянуто, в библиотеке контейнеров Java существует две основные категории, различающиеся прежде всего тем, сколько в одной ячейке контейнера «помещается» элементов. Коллекции (Collection) содержат только один элемент в каждой ячейке. К этой категории относятся список (List), где в определенной последовательности хранится группа элементов, множество (Set), в которое можно добавлять только по одному элементу определенного типа, и очередь (Queue). В контейнерах Map (карта) хранятся два объекта: ключ и связанное с ним значение. Из выходных данных программы видно, что вывод по умолчанию (обеспечиваемый методом toString() каждого контейнера) дает вполне приличные результаты. Содержимое Collection выводится в квадратных скобках, с разделением элементов запятыми. Содержимое Map заключается в фигурные скобки, ключи и значения разделяются знаком равенства (ключи слева, значения справа). Контейнеры ArrayList и LinkedList принадлежат к семейству List, и из выходных данных видно, что элементы в них хранятся в порядке вставки. Они различаются не только скоростью выполнения тех или иных операций, но и тем, что LinkedList содержит больше операций, чем ArrayList. HashSet, TreeSet и LinkedHashSet относятся к семейству Set. Из выходных данных видно, что в множествах Set каждый элемент хранится только в одном экземпляре, а разные реализации Set используют разный порядок хранения элементов. В HashSet порядок элементов определяется по довольно сложному алгоритму — пока достаточно знать, что этот алгоритм обеспечивает минимальное время выборки элементов, но порядок следования элементов на первый взгляд выглядит хаотично. Если порядок хранения для вас важен, используйте контейнер TreeSet, в котором объекты хранятся отсортированными по возрастанию в порядке сравнения, или LinkedHashSet с хранением элементов в порядке добавления. Карта (Map) позволяет искать объекты по ключу, как несложная база данных. Объект, ассоциированный с ключом, называется значением. (Карты также называют ассоциативными массивами.) В нашем примере используются три основные разновидности Map: HashMap, TreeMap и LinkedHashMap. Как и HashSet, HashMap обеспечивает максимальную скорость выборки, а порядок хранения его элементов не очевиден. TreeMap хра­нит ключи отсортированными по возрастанию, a LinkedHashMap хранит ключи в порядке вставки, но обеспечивает скорость поиска HashMap.



 

List

Контейнеры List гарантируют определенный порядок следования элементов. Интерфейс List дополняет Collection несколькими методами, обеспечивающими вставку и удаление элементов в середине списка. Существует две основные разновидности List:

· Базовый контейнер ArrayList, оптимизированный для произвольного доступа к элементам, но с относительно медленнными операциями вставки (удаления) элементов в середине списка.

· Контейнер LinkedList, оптимизированный для последовательного доступа, с быстрыми операциями вставки (удаления) в середине списка; Произвольный доступ к элементам LinkedList выполняется относительно медленно, но по широте возможностей он превосходитArrayList.

В следующем примере используется библиотека typenfo.pets из главы «Информация о типе». Она содержит иерархию классов домашних животных Pet, а также ряд вспомогательных средств для случайного построения объектов Pet. Пока достаточно знать, что (1) библиотека содержит класс Pet и производные типы, и (2) статический метод Pets.arrayList() возвращает контейнер ArrayList, заполненный случайно выбранными объектами Pet.

//: holding/ListFeatures.java

import typeinfo.pets.*;

import java.util.*;

import static net.mindview.util.Print.*;

 

public class ListFeatures {

public static void main(String[] args) {

Random rand = new Random(47);

List<Pet> pets = Pets.arrayList(7);

print("1: " + pets);

Hamster h = new Hamster();

pets.add(h); // Автоматическое изменение размера

print("2: " + pets);

print("3: " + pets.contains(h));

pets.remove(h); // Удаление объекта

Pet p = pets.get(2);

print("4: " + p + " " + pets.indexOf(p));

Pet cymric = new Cymric();

print("5: " + pets.indexOf(cymric));

print("6: " + pets.remove(cymric));

// Точно заданный объект:

print("7: " + pets.remove(p));

print("8: " + pets);

pets.add(3, new Mouse()); // Вставка no индексу

print("9: " + pets);

List<Pet> sub = pets.subList(1, 4);

print("subList: " + sub);

print("10: " + pets.containsAll(sub));

Collections.sort(sub); // Сортировка "на месте"

print("sorted subList: " + sub);

// Для containsAll() порядок неважен:

print("11: " + pets.containsAll(sub));

Collections.shuffle(sub, rand); // Случайная перестановка

print("shuffled subList: " + sub);

print("12: " + pets.containsAll(sub));

List<Pet> copy = new ArrayList<Pet>(pets);

sub = Arrays.asList(pets.get(1), pets.get(4));

print("sub: " + sub);

copy.retainAll(sub);

print("13: " + copy);

copy = new ArrayList<Pet>(pets); // Получение новой копии

copy.remove(2); // Удаление по индексу

print("14: " + copy);

copy.removeAll(sub); // Удаление заданных элементов print("15: " + copy);

print("15: " + copy);

copy.set(1, new Mouse()); // Замена элемента

print("16: " + copy);

copy.addAll(2, sub); // Вставка в середину списка

print("17: " + copy);

print("18: " + pets.isEmpty());

pets.clear(); // Удаление всех элементов

print("19: " + pets);

print("20: " + pets.isEmpty());

pets.addAll(Pets.arrayList(4));

print("21: " + pets);

Object[] o = pets.toArray();

print("22: " + o[3]);

Pet[] pa = pets.toArray(new Pet[0]);

print("23: " + pa[3].id());

}

}

<spoiler text="Output:">

1: [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug]

2: [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Hamster]

3: true

4: Cymric 2

5: -1

6: false

7: true

8: [Rat, Manx, Mutt, Pug, Cymric, Pug]

9: [Rat, Manx, Mutt, Mouse, Pug, Cymric, Pug]

subList: [Manx, Mutt, Mouse]

10: true

sorted subList: [Manx, Mouse, Mutt]

11: true

shuffled subList: [Mouse, Manx, Mutt]

12: true

sub: [Mouse, Pug]

13: [Mouse, Pug]

14: [Rat, Mouse, Mutt, Pug, Cymric, Pug]

15: [Rat, Mutt, Cymric, Pug]

16: [Rat, Mouse, Cymric, Pug]

17: [Rat, Mouse, Mouse, Pug, Cymric, Pug]

18: false

19: []

20: true

21: [Manx, Cymric, Rat, EgyptianMau]

22: EgyptianMau

23: 14

</spoiler> Строки вывода пронумерованы, чтобы вам было удобнее связывать результат с исходным кодом. В первой строке выводится исходный контейнер List с объектами Pets. В отличие от массивов, List поддерживает добавление и удаление элементов с изменением размеров списка. Результат добавления Hamster виден в строке 2: объект появляется в конце списка.

Метод contains() проверяет, присутствует ли объект в списке. Чтобы удалить объект, передайте ссылку на него методу remove(). Кроме того, при наличии ссылки на объект можно узнать его индекс в списке при помощи метода indexOf(), как показано в строке 4.

При проверке вхождения элемента в List, проверке индекса элемента и удаления элемента из List по ссылке используется метод equals() (из корневого класса Object). Все объекты Pet считаются уникальными, поэтому несмотря на присутствие двух объектов Cymric в списке, если я создам новый объект Cymric и передам его indexOf(), результат будет равен -1 (элемент не найден), а вызов remove() вернет false. Для других классов метод equals() может быть определен иначе — например, объекты String считаются равными в случае совпадения содержимого.

В строках 7 и 8 из List успешно удаляется заданный объект. Строка 9 и предшествующий ей код демонстрируют вставку элемента в середину списка. Метод subList() позволяет легко создать «срез» из подмножества элементов списка; естественно, при передаче его методуcontainsAll() большего списка будет получен истинный результат. Вызовы Collections.sort() и Collections.shuffle() для sub не влияют на результат вызова containsAll().

Метод retainAll() фактически выполняет операцию «пересечения множеств», то есть определения всех элементов сору, которые также присутствуют в sub. И снова поведение метода зависит от реализации equals().

В строке 14 представлен результат удаления элемента по индексу — это проще, чем удаление по ссылке на объект, потому что вам не придется беспокоиться о поведении equals(). Работа метода removeAll() также зависит от equals(). Как подсказывает название, метод удаляет из List все объекты, входящие в List-аргумент.

Название метода set() выбрано неудачно, потому что оно совпадает с именем класса Set — возможно, лучше было бы назвать метод «replace», потому что он заменяет элемент с заданным индексом (первый аргумент) вторым аргументом.

В строке вывода 17 показано, что для List существует перегруженный метод addAll(), вставляющий новый список в середину исходного списка (вместо простого добавления в конец методом addAll(), унаследованным от Collection).

В строках 18-20 представлен результат вызова методов isEmpty() и clear(). Строки 22 и 23 демонстрируют, что любой объект Collection можно преобразовать в массив с использованием toArray().



<== предыдущая лекция | следующая лекция ==>
Добавление групп элементов | Итераторы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.149 сек.