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

ЖАНРЫ

Философия Java3

Эккель Брюс

Шрифт:

//. holding/MapOfList.java package holding; import typeinfo pets.*, import java.util.*.

import static net.mindview util Print *;

public class MapOfList {

public static Map<Person. List<? extends Pet»

petPeople = new HashMap<Person. Li st<? extends Pet»;

static {

petPeople put(new PersonC'Dawn").

Arrays asList(new Cymric("Molly").new Mutt("Spot"))). petPeople put(new Person("Kate").

Arrays asList(new CatC'Shackleton"),

new Cat("Elsie May"), new DogCMargrett"))); petPeople put(new Person("Marilyn"). Arrays asList(

new Pug("Louie aka Louis Snorkel stein Dupree"). new Cat("Stanford aka Stinky el Negro"), new CatC'Pinkola"))). petPeople put(new Person("Luke").

Arrays asList(new Rat("Fuzzy"). new Rat("Fizzy"))). petPeople put(new Person("Isaac").

Arrays asList(new RatCFreckly"))).

}

public static void main(String[] args) {

print ("People- " + petPeople keySetO). printOPets: " + petPeople valuesO); for(Person person . petPeople.keySet) { print(person + " has-"); for(Pet pet • petPeople get(person))

printC " + pet); продолжение & }

}

} /* Output

People [Person Luke, Person Marilyn. Person Isaac, Person Dawn. Person Kate] Pets [[Rat Fuzzy. Rat Fizzy], [Pug Louie aka Louis Snorkel stein Dupree. Cat Stanford aka Stinky el Negro, Cat Pinkola]. [Rat Freckly]. [Cymric Molly. Mutt Spot], [Cat Shackleton, Cat Elsie May, Dog Margrett]] Person Luke has Rat Fuzzy Rat Fizzy Person Marilyn has

Pug Louie aka Louis Snorkel stein Dupree Cat Stanford aka Stinky el Negro Cat Pinkola Person Isaac has Rat Freckly Person Dawn has. Cymric Molly Mutt Spot Person Kate has-Cat Shackleton Cat Elsie May Dog Margrett */// ~

Map

может вернуть множество (Set) своих ключей, коллекцию (Collection) значений или множество (Set) всех пар «ключ-значение». Метод keySet создает множество всех ключей, которое затем используется в синтаксисе foreach для перебора Map.

Очередь

Очередь обычно представляет собой контейнер, работающий по принципу «первым вошел, первым вышел» (FIFO). Иначе говоря, элементы заносятся в очередь с одного «конца» и извлекаются с другого в порядке их поступления. Очереди часто применяются для реализации надежной передачи объектов между разными областями программы.

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

//: hoiding/QueueDemo.java

// Восходящее преобразование LinkedList в Queue

import java.util.*;

public class QueueDemo {

public static void printQCQueue queue) { while(queue.peek != null)

System out print(queue.remove + " "), System out printin,

}

public static void main(String[] args) {

Queue<Integer> queue = new LinkedList<Integer>;

Random rand = new Random(47); for(int i = 0; i < 10; i++)

queue.offer(rand.nextlnt(i + 10)); printQ(queue);

Queue<Character> qc = new LinkedList<Character>; for(char с ; "Brontosaurus".toCharArrayO)

qc.offer(c); printQ(qc);

}

} /* Output;

8 1 1 1 5 14 3 1 0 1

Brontosaurus

*///;-

Метод offer, один из методов Queue, вставляет элемент в конец очереди, а если вставка невозможна — возвращает false. Методы реек и element возвращают начальный элемент без его удаления из очереди, но реек для пустой очереди возвращает null, a element выдает исключение NoSuchElementException.

Методы poll и remove удаляют и возвращают начальный элемент очереди, но poll для пустой очереди возвращает null, a remove выдает NoSuchElementException.

Автоматическая упаковка преобразует результат int вызова nextlnt в объект Integer, необходимый для queue, a char с — в объект Character, необходимый для qc. Интерфейс Queue сужает доступ к методам LinkedList так, что доступными остаются только соответствующие методы и у пользователя остается меньше возможностей для вызова методов LinkedList (конечно, queue можно преобразовать обратно в LinkedList, но это создает дополнительные затруднения).

PriorityQueue

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

В приоритетной очереди следующим элементом считается элемент, обладающий наивысшим приоритетом. Например, в аэропорту пассажира, самолет которого скоро улетит, могут пропустить без очереди. В системах обработки сообщений некоторые сообщения могут быть важнее других и должны обрабатываться как можно скорее, независимо от момента их поступления. Параметризованный класс PriorityQueue был добавлен в Java SE5 как механизм автоматической реализации этого поведения.

При помещении объекта в PriorityQueue вызовом offer объект сортируется в очереди. По умолчанию используется естественный порядок помещения объектов в очередь, однако вы можете изменить его, предоставив собственную реализацию Comparator. PriorityQueue гарантирует, что при вызове peek, poll или removeQ вы получите элемент с наивысшим приоритетом.

Создание приоритетной очереди для встроенных типов — Integer, String, Character и т. д. — является делом тривиальным. В следующем примере используются те же значения, что и в предыдущем, но PriorityQueue выдает их в другом порядке:

//. hoiding/PriorityQueueDemo.java import java util *;

public class PriorityQueueDemo {

public static void main(String[] args) {

PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>; Random rand = new Random(47), for(int i = 0; i < 10; i++)

priorityQueue.offer(rand.nextInt(i + 10)); QueueDemo.pri ntQCpriori tyQueue);

List<Integer> ints = Arrays.asList(25, 22, 20.

18. 14. 9. 3. 1. 1, 2. 3. 9. 14, 18. 21. 23. 25); priorityQueue = new PriorityQueue<Integer>(ints); QueueDemo.pri ntQ(pri ori tyQueue); priorityQueue = new PriorityQueue<Integer>(

ints.sizeO. Collections reverseOrderO); pri ori tyQueue.addAl1(i nts). QueueDemo.pri ntQCpriori tyQueue);

String fact = "EDUCATION SHOULD ESCHEW 0BFUSCATI0N"; List<String> strings = Arrays.asList(fact.split("")); PriorityQueue<String> stringPQ =

new Pri ori tyQueue<Stri ng>(stri ngs); QueueDemo.printQ(stringPQ); stringPQ = new PriorityQueue<String>(

strings.sizeO. Col lections. reverseOrderO); stringPQ.addAl1(strings); QueueDemo.printQ(stringPQ);

Set<Character> charSet = new HashSet<Character>; for(char с • fact toCharArray)

charSet.add(c); // Автоматическая упаковка PriorityQueue<Character> characterPQ =

new PriorityQueue<Character>(charSet); QueueDemo printQ(characterPQ).

Поделиться с друзьями: