Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

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);

// Различие проявляется только для пустых списков: продолжение

print ("pets pollO " + pets poll О). print(pets).

pets addFirst(new RatO).

print("After addFirstO " + pets).

pets offer(Pets randomPetO).

print("After offer " + pets).

pets.add(Pets randomPetO).

print ("After addO " + pets).

pets addLast(new HamsterO).

print ("After addLastO " + pets).

print ("pets removeLastO " + pets removeLastO).

}

} /* Output

[Rat, Manx. Cymric. Mutt. Pug]

pets getFirstO. Rat

pets elementO- Rat

pets.peek О Rat

pets.removeО: Rat

pets removeFirstO: Manx

pets.poll О Cymric

[Mutt. Pug]

After addFirstO: [Rat. Mutt. Pug] After offerO: [Rat. Mutt. Pug. Cymric] After addO: [Rat. Mutt. Pug. Cymric. Pug] After addLastO* [Rat. Mutt. Pug. Cymric. Pug. Hamster] pets removeLastO. Hamster *///:-

Результат Pets.arrayList передается конструктору LinkedList для заполнения. Присмотревшись к интерфейсу Queue, вы найдете в нем методы element, offer, peek, poll и remove, добавленные в LinkedList для использования в реализации очереди (см. далее).

Стек

Стек часто называют контейнером, работающим по принципу «первым вошел, последним вышел» (LIFO). То есть элемент, последним занесенный в стек, будет первым, полученным при извлечении из стека.

В классе LinkedList имеются методы, напрямую реализующие функциональность стека, поэтому вы просто используете LinkedList, не создавая для стека новый класс. Впрочем, иногда отдельный класс для контейнера-стека лучше справляется с задачей:

//. net/mi ndvi ew/uti1/Stack java // Создание стека из списка LinkedList. package net.mindview.util: import java.util.LinkedList:

public class Stack<T> {

private LinkedList<T> storage = new LinkedList<T>; public void push(T v) { storage.addFirst(v); } public T peek О { return storage. getFirstO: } public T popO { return storage removeFirstO: } public boolean emptyО { return storage.isEmptyО: }

public String toStringO { return storage.toStringO. } } ///:-

Это простейший пример определения класса с использованием параметризации. Суффикс <Т> после имени класса сообщает компилятору, что тип является параметризованным по типу Т — при использовании класса на место Т будет подставлен фактический тип. Фактически такое определение означает: «Мы определяем класс Stack для хранения объектов типа Т». Stack реализуется на базе LinkedList, также предназначенного для хранения типа Т. Обратите внимание: метод push получает объект типа Т, а методы реек и рор возвращают объект типа Т. Метод реек возвращает верхний элемент без извлечения из стека, а метод рор удаляет и возвращает верхний элемент. Простой пример использования нового класса Stack:

Поделиться:
Популярные книги

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Старший лейтенант, парень боевой!

Зот Бакалавр
8. Героями не становятся, ими умирают
Фантастика:
боевая фантастика
5.00
рейтинг книги
Старший лейтенант, парень боевой!

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Мечников. Из доктора в маги

Алмазов Игорь
1. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Из доктора в маги

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Газлайтер. Том 31

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI