Эккель Брюс
Шрифт:
public static void display(Iterator<Pet> it) { while(it.hasNextO) {
Pet p = it nextO:
System.out.print(p.id + ":" + p + " ");
}
System out.printlnO;
}
public static void main(String[] args) { продолжение &
ArrayList<Pet> pets = Pets.arrayList(8); LinkedList<Pet> petsLL = new LinkedList<Pet>(pets); HashSet<Pet> petsHS = new HashSet<Pet>(pets); TreeSet<Pet> petsTS = new TreeSet<Pet>(pets); di splay(pets.iterator); display(petsLL iteratorO); di splay(petsHS.iterator); di spl ay(petsTS. iteratorO);
}
} /* Output:
0:Rat 1-Manx 2-Cymric 3-Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat l.Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 4:Pug 6:Pug 3:Mutt l:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat 5 Cymric 2:Cymric 7:Manx l:Manx 3:Mutt 6:Pug 4:Pug 0:Rat *///:-
В методе display отсутствует информация о типе последовательности, и в этом проявляется истинная мощь итераторов: операция перемещения по последовательности отделяется от фактической структуры этой последовательности. Иногда говорят, что итераторы унифицируют доступ к контейнерам.
Listlterator
Listlterator — более мощная разновидность Iterator, поддерживаемая только классами List. Если Iterator поддерживает перемещение только вперед, List-Iterator является двусторонним. Кроме того, он может выдавать индексы следующего и предыдущего элементов по отношению к текущей позиции итератора в списке и заменять последний посещенный элемент методом set. Вызов listIterator возвращает Listlterator, указывающий в начало List, а для создания итератора Listlterator, изначально установленного на элемент с индексом п, используется вызов listlterator(n). Все перечисленные возможности продемонстрированы в следующем примере:
//: hoiding/Listlteration java import typeinfo.pets.*, import java.util *;
public class Listlteration {
public static void main(String[] args) {
List<Pet> pets = Pets.arrayList(8); ListIterator<Pet> it = pets.listlteratorO; while(it.hasNextO)
System.out.print(it.next0 + " + it.nextlndexO + " + it.previousIndexO + ");
System.out.printi n. // В обратном направлении: while(it.hasPreviousO)
System.out.print(it.previousO.id + " "); System, out pri nti nO. System.out.printin(pets): it = pets.listlteratorO): while(it.hasNextO) { it.nextO:
i t.set(Pets.randomPet 0):
System out println(pets).
}
} /* Output.
Rat. 1. 0; Manx. 2. 1. Cymric. 3. 2; Mutt. 4. 3. Pug. 5. 4. Cymric. 6. 5. Pug. 7. 6. Manx. 8. 7. 7 6 5 4 3 2 1 0
[Rat. Manx. Cymric. Mutt. Pug. Cymric. Pug. Manx] [Rat. Manx. Cymric. Cymric. Rat. EgyptianMau. Hamster. EgyptianMau] *///•-
Метод Pets.randomPet используется для замены всех объектов Pet в списке, начиная с позиции 3 и далее.
LinkedList
LinkedList тоже реализует базовый интерфейс List, как и ArrayList, но выполняет некоторые операции (например, вставку и удаление в середине списка) более эффективно, чем ArrayList. И наоборот, операции произвольного доступа выполняются им с меньшей эффективностью.
Класс LinkedList также содержит методы, позволяющие использовать его в качестве стека, очереди (Queue) или двусторонней очереди (дека).
Некоторые из этих методов являются псевдонимами или модификациями для получения имен, более знакомых в контексте некоторого использования. Например, методы getFirst и element идентичны — они возвращают начало (первый элемент) списка без его удаления и выдают исключение NoSuch-ElementException для пустого списка. Метод реек представляет собой небольшую модификацию этих двух методов: он возвращает null для пустого списка.
Метод addFirst вставляет элемент в начало списка. Метод offer делает то же, что add и addLast — он добавляет элемент в конец списка. Метод removeLast удаляет и возвращает последний элемент списка.
Следующий пример демонстрирует схожие и различающиеся аспекты этих методов:
// hoiding/LinkedListFeatures java import typeinfo pets *; import java util *;
import static net.mindview util Print.*;
public class LinkedListFeatures {
public static void main(String[] args) { LinkedList<Pet> pets =
new LinkedList<Pet>(Pets arrayList(5)); print(pets); // Идентично
print("pets.getFirst• " + pets getFirstO).
print ("pets element О " + pets.elementO);
// Различие проявляется только для пустых списков:
print("pets peekO: " + pets.peekO);
// Идентично, удаление и возврат первого элемента.
print("pets removeO: " + pets.removeO);
print ("pets removeFirstO: " + pets.removeFirstO);
// Различие проявляется только для пустых списков: продолжение