Spec-Zone .ru
спецификации, руководства, описания, API
След: Наборы
Урок: Интерфейсы
Интерфейс Набора
Домашняя страница > Наборы > Интерфейсы

Интерфейс Набора

A Collection представляет группу объектов, известных как ее элементы. Collection интерфейс используется, чтобы раздать наборы объектов, где максимальная общность требуется. Например, условно у всех реализаций набора общего назначения есть конструктор, который берет a Collection параметр. Этот конструктор, известный как конструктор преобразования, инициализирует новый набор, чтобы содержать все элементы в указанном наборе, безотносительно подынтерфейса данного набора или типа реализации. Другими словами это позволяет Вам преобразовывать тип набора.

Предположите, например, что у Вас есть a Collection<String> c, который может быть a List, a Set, или другой отчасти Collection. Эта идиома создает новое ArrayList (реализация List интерфейс), первоначально содержащий все элементы в c.

List<String> list = new ArrayList<String>(c);

Следующие шоу Collection интерфейс.

public interface Collection<E> extends Iterable<E> {
    // Basic operations
    int size();
    boolean isEmpty();
    boolean contains(Object element);
    // optional
    boolean add(E element);
    // optional
    boolean remove(Object element);
    Iterator<E> iterator();

    // Bulk operations
    boolean containsAll(Collection<?> c);
    // optional
    boolean addAll(Collection<? extends E> c); 
    // optional
    boolean removeAll(Collection<?> c);
    // optional
    boolean retainAll(Collection<?> c);
    // optional
    void clear();

    // Array operations
    Object[] toArray();
    <T> T[] toArray(T[] a);
}

Интерфейс делает, о каком Вы ожидали бы, учитывая, что a Collection представляет группу объектов. У интерфейса есть методы, чтобы сказать Вам, сколько элементов находится в наборе (size, isEmpty), чтобы проверить, является ли данный объект в наборе (contains), чтобы добавить и удалить элемент из набора (add, remove), и обеспечить iterator по набору (iterator).

add метод определяется обычно достаточно так, чтобы он имел смысл для наборов, которые позволяют копии так же как тех, которые не делают. Это гарантирует что Collection будет содержать указанный элемент после того, как вызов завершается, и возвраты true если Collection изменения в результате вызова. Точно так же remove метод разрабатывается, чтобы удалить единственный экземпляр указанного элемента от Collection, принятие, что это содержит элемент, чтобы запуститься с, и возвратиться true если Collection был изменен в результате.

Пересечение Наборов

Есть два способа пересечь наборы: (1) с for-each создайте и (2) при использовании Iterators.

для - каждая Конструкция

for-each конструкция позволяет Вам кратко пересекать набор или массив, использующий a for цикл — видит для Оператора. Следующий код использует for-each создайте, чтобы распечатать каждый элемент набора на отдельной строке.

for (Object o : collection)
    System.out.println(o);

Iterators

Iterator объект, который позволяет Вам пересечь через набор и удалить элементы из набора выборочно при желании. Вы добираетесь Iterator для набора, вызывая iterator метод. Следующее Iterator интерфейс.

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional
}

hasNext возвраты метода true если у итерации есть больше элементов, и next метод возвращает следующий элемент в итерации. remove метод удаляет последний элемент, который был возвращен next от базового Collection. remove однажды метод можно вызвать только на звонок next и выдает исключение, если это правило нарушается.

Отметьте это Iterator.remove единственный безопасный способ изменить набор во время итерации; поведение является неуказанным, если базовый набор изменяется каким-либо другим способом, в то время как итерация происходит.

Использовать Iterator вместо for-each создайте, когда Вы нуждаетесь к:

Следующий метод показывает Вам, как использовать Iterator фильтровать произвольное Collection — то есть, пересеките набор, удаляющий определенные элементы.

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

Эта простая часть кода является полиморфной, что означает, что это работает на любого Collection независимо от реализации. Этот пример демонстрирует, как легкий это должно записать полиморфный алгоритм, используя Платформу Наборов Java.

Операции Объема Интерфейса набора

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

addAll, removeAll, и retainAll методы весь возврат true если цель Collection был изменен в процессе выполнения работы.

Как простой пример питания объемных операций, полагайте, что следующая идиома удаляет все экземпляры указанного элемента, e, от a Collection, c.

c.removeAll(Collections.singleton(e));

Более определенно предположите, что Вы хотите удалить весь из null элементы от a Collection.

c.removeAll(Collections.singleton(null));

Эта идиома использование Collections.singleton, который является статическим методом фабрики, который возвращает неизменное Set содержа только указанный элемент.

Операции над массивом Интерфейса набора

toArray методы обеспечиваются как мост между наборами и более старыми API, которые ожидают массивы на вводе. Операции над массивом позволяют содержание a Collection быть преобразованным в массив. Простая форма без параметров создает новый массив Object. Более сложная форма позволяет вызывающей стороне предоставлять массиву или выбирать тип времени выполнения выходного массива.

Например, предположите это c a Collection. Следующий отрывок выводит содержание c в недавно выделенный массив Object чья длина идентична числу элементов в c.

Object[] a = c.toArray();

Предположите это c как известно, содержит только строки (возможно, потому что c имеет тип Collection<String>). Следующий отрывок выводит содержание c в недавно выделенный массив String чья длина идентична числу элементов в c.

String[] a = c.toArray(new String[0]);

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Интерфейсы
Следующая страница: Интерфейс Набора