Лабораторная работа №7 «Работа со стандартными классами коллекций»




Скачать 153.27 Kb.
НазваниеЛабораторная работа №7 «Работа со стандартными классами коллекций»
Дата публикации19.06.2013
Размер153.27 Kb.
ТипЛабораторная работа
Лабораторная работа №7

«Работа со стандартными классами коллекций»
Цель:

Получить практические навыки использования стандартных коллекций языка Groovy.

Краткие теоретические сведения

Понятие коллекции


Коллекция — программный объект, содержащий в себе, тем или иным образом, набор значений одного или различных типов, и позволяющий обращаться к этим значениям.
Коллекция позволяет записывать в себя значения и извлекать их. Назначение коллекции — служить хранилищем элементов и обеспечивать доступ к ним. Обычно коллекции используются для хранения групп однотипных элементов, подлежащих стереотипной обработке. Для обращения к конкретному элементу коллекции могут использоваться различные методы, в зависимости от её логической организации. Реализация может допускать выполнение отдельных операций над коллекциями в целом. Наличие операций над коллекциями во многих случаях может существенно упростить программирование.
Абсолютное большинство современных языков программирования содержит набор стандартных классов коллекций, использование которых существенно упрощает работу с наборами данных, в виде объектов.
Следует отметить карты. Карта хранит пары пары «ключ-значение». Хотя карты являются частью системы коллекций, они, строго говоря, коллекциями не являются. Но есть возможность поместить элементы карты в коллекцию.

Классы коллекций языка Groovy

Язык Groovy, кроме своих коллекций, поддерживает все стандартные коллекции языка Java.
^

Интерфейсы коллекций в языке Java, поддерживаемые в языке Groovy()

Интерфейс Collection


Является корнем всей иерархии классов-коллекций. Он определяет базовую функциональность любой коллекции - набор методов, которые позволяют добавлять, удалять, выбирать элементы коллекции. Классы, которые имплементируют интерфейс Collection, могут содержать дубликаты и пустые (null) значения.

Collection – обобщенный интерфейс, объявленный следующим образом:

interface Collection

Здесь E указывает тип объектов, которые должна содержать коллекция.

Некоторые методы, определенные в интерфейсе Collection:

  • int size() ─ количество элементов

  • boolean isEmpty() ─ проверка на пустоту (true – коллекция пуста)

  • boolean contains(Object obj) ─ проверка на вхождение одного элемента (trueobj является элементом вызывающей коллекции)

  • boolean containsAll(Collection<?> c) ─ проверка на вхождение всех элементов коллекции (true – коллекция содержит все элементы c)

  • boolean add(E obj) ─ добавление obj к вызывающей коллекции; возвращает true, если obj добавлен

  • boolean addAll(Collectionextends E> c) ─ добавление все элементов c к вызывающей коллекции; возвращает true, если операция удалась

  • boolean remove(Object obj) ─ удаление один экземпляр obj из вызывающей коллекции; возвращает true, если элемент удален

  • boolean removeAll(Collection с) ─ удаление всех элементов c из вызывающей коллекции; возвращает true, если в результате коллекция изменится, т. е. элементы удалены

  • void clear() ─ удаление всех элементов

  • Object[] toArray() – возвращает массив, содержащий все элементы вызывающей коллекции; элементы массива являются копиями элементов коллекции

  • <T> T[] toArray(T array[]) – возвращает массив, содержащий элементы вызывающей коллекции; элементы массива являются копиями элементов коллекции; если размер массива array равен количеству элементов, он возвращается; если размер array меньше количества элементов, создается и возвращается новый массив нужного размера; если размер array больше количества элементов, то элементы, следующие за последним из коллекции, устанавливаются равными null.
^

Интерфейс List


Классы, которые реализуют этот интерфейс, содержат упорядоченную последовательность объектов (объекты хранятся в том порядке, в котором они были добавлены). Интерфейс List расширяет интерфейс Collection таким образом любой класс имплементирующий List реализует все методы определенные в Collection, в то же время вводятся новые методы которые позволяют добавлять и удалять элементы из списка.

^ List – обобщенный интерфейс, объявленный следующим образом:

interface List

Здесь E указывает тип объектов, которые должен содержать список.

Некоторые методы, определенные в интерфейсе List:

  • E get(int index) ─ возвращает объект, сохраненный в указанной позиции вызывающего списка

  • E set(int index, E obj) ─ запись по индексу

  • void add(int index, E obj) ─ добавление по индексу

  • E remove(int index) – удаление по индексу

  • int indexOf(Object obj) ─ поиск объекта с начала

  • int lastIndexOf(Object obj) ─ поиск объекта с конца

    Классы реализующие данный интерфейс:

      1. Класс AbstractList



Расширяет AbstractCollection и реализует большую часть интерфейса List.


      1. Класс AbstractSequentalList



    Расширяет AbstractList для использования в коллекциях, использующих последовательности вместо случайного доступа к элементам.




      1. ^ Класс ArrayList



Класс, реализующий коллекцию – список на базе массива. Этот класс расширяет AbstractList и реализует интерфейс List. В классе определены следующие конструкторы:

  • ArrayList() ─ создает пустой список

  • ArrayList(Collection extends E> c) ─ создает список – копию коллекции

  • ArrayList(int capacity) ─ создает пустой список заданной вместимости

    В классе определены дополнительные методы:

  • ensureCapacity(int c) ─ определение вместимости

  • trimToSize() ─ “подгонка” вместимости



      1. Класс LinkedList



Класс, реализующий коллекцию – двусвязный список. Класс расширяет AbstractSequentalList и реализует интерфейсы List, Dequeue и Queue. В классе определены следующие конструкторы:

  • LinkedList() ─ создает пустой список

  • LinkedList(Collection Extends E> c) ─ создает список – копию коллекции


В языке Groovy реализован класс Range(класс диапозона), имеющий следующие методы:
boolean contains(Object obj) - Возвращает true, если Range содержит объект.

^ Object get(int index) - Возвращает элемент по индексу в Range.

Comparable getFrom() - возвращает младший элемент Range.

Comparable getTo() - возвращает старший элемент Range.

int size() - возвращает количество элементов в Range.

^ List subList(int fromIndex, int toIndex) - Возвращает часть элементов, находящихся между значениями индексов.
В языке Groovy реализован класс List, имеющий следующие методы:
boolean add(Object value) - Добавляет объект в конец списка.

void add(int index, Object value) - Добавляет объект на соответствующую позицию.

boolean addAll(Collection values) - Добавление коллекции в конец списка.

boolean contains(Object value) - Возвращает true, если список содержит элемент.

^ List flatten() - Выравнивает List и возващает новый список.

Object get(int index) - Возвращает элемент по индексу.
Object getAt(int index) - Возвращает элемент по индексу.

List getAt(Range range) - Возвращает новый список, который является подсписком этого списка, основанного на данном

диапазоне.

^ List getAt(Collection indices) - Возвращает новый список

List intersect(Collection collection) - Возвращает список всех элементов, котовые принаждлежат обеим коллекциям.

boolean isEmpty() - Возвращает true, если список пуст.

^ Collection leftShift(Object value) - Лёгкое добавление элемента в левый конец списка.

List minus(Collection collection) - Возвращает список без элементов, содержащихся во второй колекции.

^ List plus(Object value) - Возвращает список с добавление элемента.

List plus(Collection collection) - Возвращает список с новыми элементами из второй коллекции.

Object pop() - Возроащает последний элемент коллекции.

void putAt(int index, Object value) - Вводит элемент слева от позиции указаной в аргументах.

^ Object remove(int index) - Удаляет элемент по индексу.

boolean remove(Object value) - Удаляет первое вхождение элемента в список.

List reverse() - Создаёт новый список с инверсным порядком элементов.

int size() - Возвращает длину списка.

List sort() - Возвращает отсортированный список.
^

Интерфейс Set


Классы, которые реализуют этот интерфейс, не разрешают наличие дубликатов. В коллекции этого типа допускается наличие только одной ссылки типа null. Интерфейс Set расширяет интерфейс Collection, таким образом, любой класс, имплементирующий Set, реализует все методы определенные в Collection. Любой объект, добавляемый в Set, должен реализовать метод equals() для того, что бы его можно было сравнить с другими.

Методы, определенные в интерфейсе Set:

  • addAll(Collection c) – объединение множеств

  • retainAll(Collection c) – пересечение множеств

  • containsAll(Collection c) – проверка вхождения

  • removeAll(Collection c) – разность множеств

    Классы реализующие данный интерфейс:

    1. Класс AbstractSet



    Расширяет AbstractCollection и реализует большую часть интерфейса Set.



    2. ^ Класс HashSet



Класс, реализующий коллекцию – множество на основе хэша. Класс расширяет AbstractSet и реализует интерфейс Set. В классе определены следующие конструкторы:

  • HashSet() ─ создает пустое множество

  • HashSet(Collection c) ─ создает множество заполненное элементами коллекции с

  • HashSet(int capacity) ─ создает множество с емкостью capacity

  • HashSet(int capacity, float fillRatio) ─ создает множество с емкостью сapacity и степенью заполнения fillRatio.



      1. Класс TreeSet



Класс расширяет AbstractSet и реализует интерфейс NavigableSet. Он создает коллекцию, которая для хранения элементов применяет дерево. Объекты сохраняются в отсортированном порядке по возрастанию. Отметим два конструктора:

  • TreeSet() ─ конструирует пустой набор-дерево, который будет сортировать элементы в естественном порядке возрастания

  • TreeSet(Collection c) ─ строит набор-дерево, содержащий элементы коллекции с.
^

Интерфейс Queue и Dequeue


Интерфейс Queue расширяет Collection и объявляет поведение очередей, которые представляют собой список с дисциплиной «перый вошел – первый вышел». Однако существуют разные типы очередей, в которых порядок основан на некотором критерии.

^ Queue – обобщенный интерфейс со следующим объявлением:

interface Queue

Здесь E указывает тип объектов, которые будут храниться в очереди.

Методы, определенные в Queue:

  • E element() – Возвращает элемент из головы очереди. Элемент не удаляется. Если очередь пуста, инициируется исключение NoSuchElementException.

  • boolean offer(E obj) – Пытается добавить obj в очередь. Возвращает true, если obj добавлен, и false – в противном случае.

  • E peek() – Возвращает элемент из головы очереди. Возвращает null, если очередь пуста. Элемент не удаляется.

  • E poll() – Возвращает элемент из головы очереди и удаляет его. Возвращает null, если очередь пуста.

  • E remove() – Удаляет элемент из головы очереди, возвращая его. Инициирует исключение NoSuchElementException, если очередь пуста.

Dequeue расширяет Queue и описывает поведение двунаправленной очереди. Двунаправленная очередь может функционировать как стандартная очередь «первый вошел – первый вышел» либо как стек «последний вошел – первый вышел». Dequeue – обобщенный интерфейс со следующим объявлением:

interface Dequeue

Здесь E специфицирует тип объектов, которые будет содержать двусторонняя очередь.

Некоторые методы:

  • void addFirst(E obj) – добавить элемент в голову двунаправленной очереди

  • void addLast(E obj) – добавить элемент в хвост двунаправленной очереди

  • E removeFirst() – возвратить и удалить элемент из головы двунаправленной очереди

  • E removeLast() – возвратить и удалить элемент из хвоста двунаправленной очереди

  • Iterator<E> descendingIterator() – возвращает итератор, перемещающийся от хвоста к голове двунаправленной очереди

    ^ Классы реализующие данный интерфейс:

      1. Класс ArrayDequeue



Класс, реализующий коллекцию – динамический массив неограниченной емкости. Класс расширяет AbstractCollection и реализует интерфейс Dequeue. Некоторые конструкторы класса:

  • ArrayDequeue() ─ создает пустую двунаправленную очередь; ее начальная емкость – 16 элементов

  • ^ ArrayDequeue(int size) ─ создает двунаправленную очередь c указанной емкостью

В обоих случаях по мере необходимости емкость увеличивается при добавлении новых элементов в двунаправленную очередь.
^

Интерфейс Map


Классы, которые реализуют этот интерфейс, хранят неупорядоченный набор объектов парами ключ/значение. Каждый ключ должен быть уникальным. Порядок следования пар ключ/значение не определен. Интерфейс Map не расширяет интерфейс Collection. Карты не реализуют интерфейс Iterable. Это означает, что нельзя проходить в цикле по карте, используя форму “for-each” цикла for.

Map – обобщенный интерфейс, объявленный следующим образом:

interface Map

Здесь K указывает тип ключей, а V – тип хранимых значений.

Некоторые методы, определенные в интерфейсе Map:

  • V get(K k, V v) ─ получение значения по ключу

  • V put(K k, V v) ─ запись

  • V remove(Object k) ─ удаление по ключу

  • boolean containsKey(Object k) – проверка наличия ключа

  • boolean containsValue(Object v) ─ проверка наличия значения

  • Set<Map.Entry<K, V>> entrySet() ─ взятие множества пар

  • Collection<V> values() ─ взятие коллекции значений

  • Set<K> keySet() ─ взятие множества ключей

  • void putAll(Map m) ─ добавление коллекции

    Классы реализующие данный интерфейс:

      1. Класс AbstractMap


Реализует большую часть интерфейса Map.


      1. Класс HashMap



Класс HashMap расширяет AbstractMap и реализует интерфейс Map. Этот класс для хранения карты использует хэш-таблицу. В классе определены следующие конструкторы:

  • HashMap() ─ конструирует хэш-карту по умолчанию

  • HashMap(MapExtends K, ? extends V> m) ─ инициирует хэш-карту элементами m

  • HashMap(int capacity) ─ создает коллекцию с емкостью capacity

  • HashMap (int capacity, float fillRatio) ─ создает коллекцию с емкостью capacity и отношением наполнения fillRatio.




      1. ^ Класс TreeMap



Класс TreeMap расширяет AbstractMap и реализует интерфейс NavigableMap. Этот класс создает карту, размещенную в древовидно структуре. Он предлагает эффективный способ хранения пар «ключ-значение» в сортированном порядке и позволяет быстрое извлечение. Отметим два конструктора:

  • TreeMap() ─ конструирует пустую карту-дерево

  • TreeMap(Map m) ─ строит карту-дерево с элементами из m



      4. Класс Map(класс существующий в Groovy)


boolean containsKey(Object key) - Возвращает true если ключ существует в Map

^ Object get(Object key) - Возвращает элемент по ключу, если элемента не существует возвращает null

Object get(Object key, Object defaultValue) - Возвращает элемент по ключу, если элемента нет то возвращает элемент defaultValue.

int size() - возвращает количество элементов в map.

Collection values() - Возвращает значение элементов в map
^ Примеры работы с коллекциями:

Пример №1:

public class Test{
public static void main(def args){

LinkedList mylist=new LinkedList();
// добавим элементы в коллекцию

mylist.add("Иванов");

mylist.add("Петров");

mylist.add("Сидоров");
// печать содержимого коллекции

System.out.println(mylist);
// добавим первый элемент

mylist.addFirst("Бобров");
// добавим последний элемент

mylist.addLast("Яковлев");
// добавим элемент с индексом 3

mylist.add(3,"Александров");
// удалим элемент с индексом 1

mylist.remove(1);
// удалим последний элемент

mylist.removeLast();

// печать содержимого коллекции

println(mylist);

}}


Пример №2:

class Person {

private String name;

private int age;

Person (String x, int y){

name=x;

age=y;

}

public String toString(){

return name+""+age;

}}
public class Test{
public static void main(def args){

TreeMapmymap=new TreeMap();

mymap.put(1,new Person("Иванов",18));

mymap.put(5, new Person("Петров",20));

mymap.put(7, new Person("Сидоров",21));

mymap.put(12, new Person("Фомин",19));

mymap.put(23, new Person("Яковлев",19));
Set> myset = mymap.entrySet();

println("Содержимое коллекции: ");

for (Map.Entry x:myset){

println(x.getKey()+": "+x.getValue());

}

println("Размер коллекции: "+mymap.size());

}}

Итераторы

Часто проходить по всем элементам коллекции. Один из способов сделать это – использовать итератор, представляющий собой объект, реализующий один из двух интерфейсов: Iterator или ListIterator. Iterator позволяет организовать цикл для прохода по коллекции, получая либо удаляя элементы. ListIterator расширяет Iterator для обеспечения двунаправленного прохода по списку и модификации элементов.

Iterator и ListIterator – обобщенные интерфейсы, объявленные, как показано ниже:

interface Iterator

interface ListIterator

Здесь ^ E представляет собой тип объектов, по которым будут выполняться итерации.

Методы, определенные в Iterator:

  • boolean hasNext() ─ возвращает true, если есть еще элементы; в противном случае возвращает false

  • E next() ─ возвращает следующий элемент

  • void remove() – удаляет текущий элемент

В общем случае, применения итератора для цикла по содержимому коллекции сводится к выполнению следующих шагов:

1. Установить итератор на начало коллекции, получив его от метода коллекции iterator().

2. Организовать цикл, вызывающий hasNext(). Выполнять циклическую итерацию до тех пор, пока hasNext() возвращает true.

3. Внутри цикла получать каждый элемент, вызывая метод next().

Пример.

public class Test{
public static void main(def args){

ArrayList myarray=new ArrayList();
myarray.add(10);

myarray.add(-5);

myarray.add(67);
Iterator myiter=myarray.iterator();

while(myiter.hasNext()){

Integer x=myiter.next();

print(x+" ");

}

}}

Варианты заданий

Сохранить в двух разных коллекциях (в соответствии с вариантом) набор объектов пользовательского класса. Осуществить вывод на экран, механизм добавления и удаления объектов. Рассмотреть типы коллекций, указать их сходства и отличия.


Вариант

Коллекция №1

Коллекция №2

1

ArrayList

HashMap

2

LinkedList

HashMap

3

HashSet

HashMap

4

TreeSet

HashMap

5

List

HashMap

6

ArrayList

TreeMap

7

LinkedList

TreeMap

8

HashSet

TreeMap

9

TreeSet

TreeMap

10

List

TreeMap

11

ArrayList

Map

12

LinkedList

Map

13

HashSet

Map

14

TreeSet

Map

15

List

Map


Содержание отчета


  1. Титульный лист:

  • название дисциплины;

  • номер и наименование работы;

  • фамилия, имя, отчество студента;

  • дата выполнения;

  • номер варианта.

  1. Постановка задачи.

  2. Обзор коллекций.

  3. Листинг демонстрационной программы.



Дополнительная информация


  1. Barclay, Savage. Groovy programming, 2007 (Elsevier). Главы: 4

  2. Subramaniam. Programming Groovy, 2008 (Pragmatic Bookshelf) Главы: 7

  3. Davis. Groovy Recipes, 2008 (Pragmatic Bookshelf) стр.: 58-67.

  4. Konig. Groovy in Action, 2007 (Manning)стр.:41.

Добавить документ в свой блог или на сайт

Похожие:

Отчёт по теме: «Лабораторная работа №1» Амосов Д. В
Лабораторная работа №1. Интегрированная среда разработки Microsoft Visual C++ 2008. Создание простейшего приложения

Лабораторная работа №5 Лабораторная работа №5 Тема: «Классы и объекты»
Лабораторную работу выполнить без использования сред разработки (Intellij idea, Eclipse, NetBeans и др.)

Лабораторная работа №6 Лабораторная работа №6 Тема: «Java-апплеты»
Лабораторную работу выполнить без использования сред разработки (Intellij idea, Eclipse, NetBeans и др.)

Лабораторная работа №4 Лабораторная работа №4 Тема: «Типы данных,...
Лабораторную работу выполнить без использования сред разработки (Intellij idea, Eclipse, NetBeans и др.)

Лабораторная работа №4 Лабораторная работа №4 Тема: «Типы данных, переменные и массивы Java»
Ввести с консоли n целых чисел и поместить их в массив. Найти среди них четные и нечетные числа и вывести их на консоль

Лабораторная работа №3 Численное интегрирование
Данная лабораторная работа посвящена вычислению определенного интеграла различными численными методами. Все они основаны на том,...

Лабораторная работа Самостоятельная работа
Виды учебной работы, включая самостоятельную работу студентов и трудоемкость (в часах)

Лабораторная работа Самостоятельная работа
Виды учебной работы, включая самостоятельную работу студентов и трудоемкость (в часах)

OpenOffice org. Лабораторная работа №2-1 Работа с таблицами
Напечатать таблицу приведённую ниже. Рисунки находятся на сервере, в папке //kvt/image/mendeleev

Календарно-тематическое планирование Предмет Физическая культура Классы
Плановых контрольных работ ( указать виды: диктант, изложение, контрольная работа, лабораторная работа, зачёт, тест)

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница