Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница42 из 90
1   ...   38   39   40   41   42   43   44   45   ...   90

import java.util.*;
class Tre eMa pDe mo {
public static voi d ma in ( St r in g a r g s []) {
// Создать карту- дерево g ,
Double>();
// Поместить элементы в карту.
Ш . р и МДж он Доу", new Double (3 43 4 .
34)) ;
t m . p u t (Том Смит", ne w D o u b l e (123.22));
t m .p u t ("Джейн Бейкер", new D o u b l e (137 8.00));
tm.put("Tofl Халл", ne w D o u b l e (99.22));
t m . p u t ("Ральф Смит", ne w D o u b l e (-19.08));
// Получить набор элементов e t < M a p .Entry> set = t m . e n t r y S e t ();
// Отобразить элементы o r ( M a p .Entry me :
set) {
S y s t e m . o u t . p r i n t ( m e .g e t K e y () +
");
S y s t e m . o u t . p r i n t l n ( m e .g e t V a l u e ());
}
S y s t e m . o u t .p r i n t l n ();

5 1 Часть II. Библиотека Java
// Добавить 100 0 насчет Джона Доу.
double balance = t m . g e t (Джон Доу");
^ . р и МДж он Доу", balance + 1000);
S y s t e m . o u t . p r i n t l n (Новый баланс Джона Доу: " +
t m .g e t (Джон До у "Вот как выглядит вывод программы.
Джейн Бейкер: 137 8.0 Джон Доу: 3 434.34

Ральф Смит: -19.08
Тод Халл: 99.22 Том См и т :
Текущий баланс Джона Доу: Обратите внимание на то, что класс
ТгееМар сортирует ключи. Однако в данном случае они сортируются по имени вместо фамилии. Вы можете изменить это поведение, указав компаратор при создании карты, как уже кратко упоминалось.
Класс Класс
LinkedHashMap расширяет класс
HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать перебор карты в порядке вставки. То есть, когда происходит итерация по коллекционному представлению объекта класса
LinkedHashMap, элементы будут возвращаться в том порядке, в котором они вставлялись. Вы также можете создать объект класса
LinkedHashMap, возвращающий свои элементы в том порядке, в котором к ним в последний раз осуществлялся доступ. Класс
LinkedHashMap является обобщенным классом, имеющим следующее объявление,
class LinkedHashMapci?, Здесь К указывает тип ключей, а У — тип хранимых значений.
Класс
LinkedHashMap определяет следующие конструкторы i n k e d H a s h M a p ()

L i n k e d H a s h M a p (Мар
V> т i n k e d H a s h M a p (int емкость i n k e d H a s h M a p (int емкость float
коэффЗаполнения)
L i n k e d H a s h M a p (int емкость float
коэффЗаполнения,
b oolean
Порядок)
Первая форма создает объект класса
LinkedHashMap по умолчанию. Вторая форма инициализирует объект класса
LinkedHashMap элементами ш Третья форма инициирует емкость. Четвертая форма инициализирует и емкость, и коэффициент заполнения. Смысл этих параметров тот же, что и у класса
HashMap. Емкость по умолчанию составляет 16, коэффициент заполнения — 0,75. Последняя форма позволяет задать, в каком порядке в связном списке будут размещаться элементы — в порядке вставки или последнего доступа. Если параметр Порядок содержит значение true, используется порядок доступа, если значение false
— порядок вставки.
Класс
LinkedHashMap добавляет только один новый метод к тем, что определены в классе
HashMap. Этот метод — removeEldestEntry ()
, ион показан ниже,
prot e c t e d b oolean r e m o v e E l d e s t E n t r y ( M a p .Entry
V>
Этот метод вызывается из методов put (
) и put
All ()
. Самый старый элемент передается в е. По умолчанию этот метод возвращает значение false и не делает ничего. Однако если вы переопределите этот метод, то сможете получить объект класса
LinkedHashMap, который удаляет самый старый элемент в карте. Чтобы
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 1 сделать это, переопределенный метод должен возвращать значение true. Чтобы сохранять самый старый элемент, возвращайте значение Класс Класс
IdentityHashMap расширяет класс
AbstractMap и реализует интерфейс
Мар. Он похож на класс
HashMap всем, за исключением того, что при сравнении элементов использует проверку эквивалентности ссылок. Класс
IdentityHashMap
— это обобщенный класс со следующим объявлением IdentityHashMapc#, Здесь .Куказывает тип ключей, а У — тип хранимых значений. Документация по
API явно устанавливает, что класс
IdentityHashMap не предназначен для общего применения.
Класс Класс
ЕпишМар расширяет класс
AbstractMap и реализует интерфейс
Мар. Он специально предназначен для использования с ключами типа enum. Это обобщенный класс, имеющий следующее объявление EnumMap, Здесь указывает тип ключей, а
V— тип хранимых значений. Отметим, что класс К должен расширять класс Ка это требует, чтобы ключи были типа В классе
EnumMap определены следующие конструкторы n umMap(Class

кТип)
E n u m M a p (Марс К ,
? extends
V>
m)
EnumMap(EnumMapcK, ? extends
V> Первый конструктор создает пустой объект класса
EnumMap для типа кТип. Второй создает объект класса
EnumMap, инициированный значениями из em. Класс
EnumMap не определяет собственных методов.
Компараторы
Классы
TreeSet и
ТгееМар сохраняют элементы в отсортированном порядке. Однако понятие порядок сортировки точно определяет применяемый ими компаратор. По умолчанию эти классы сохраняют элементы, используя то, что в Java называется естественным порядком, что, как правило, представляет собой тот порядок, которого вы можете ожидать (А перед Впереди т.д.). Если хотите упорядочить элементы иным образом, то указывайте объект интерфейса
Comparator при создании набора или карты. Это позволит вам подробно управлять тем, как элементы будут сохраняться в отсортированных коллекциях или картах.
Интерфейс
Comparator — это обобщенный интерфейс со следующим объявлением Здесь параметр типа Т указывает тип сравниваемых объектов.
И нтерфейс
Comparator определяет два метода — compare
() и equals (). Метод compare ()
, представленный ниже, сравнивает два элемента по порядку c o m p a r То б ъ е к т Т

объект2)
Здесь объект1
и объект —
это объекты, которые нужно сравнить. Обычно этот метод возвращает значение нуль, если объекты эквивалентны. Он возвращает положительное значение, если объект больше, чем объект 2
, в противном

5 1 Часть II. Библиотека случае возвращается отрицательное значение. Этот метод может передать исключение C l a s s C a s t E x c e p ti o n , если типы сравниваемых объектов несовместимы. Реализуя метод co m p are ( ), вы можете изменить порядок объектов. Например, чтобы сортировать в обратном порядке, вы можете создать компаратор, который возвращает обратные значения при сравнении.
Метод e q u a l s (), показанный ниже, проверяет объект на эквивалентность вызывающему компаратору equals(object

объект)
Здесь объект — это объект, который нужно проверить на эквивалентность. Метод возвращает значение t r u e , если объект и вызывающий объект представляют собой объекты интерфейса C o m p a ra to r и используют одинаковый способ упорядочения. В противном случае он возвращает значение f a l s e . Переопределение метода e q u a ls () не требуется, и большинство простых компараторов в этом не нуждается.
Использование компараторов
Ниже представлен пример, демонстрирующий мощность настраиваемых компараторов. Он реализует метод co m p are () для строк, работающий в порядке, обратном нормальному. То есть он позволяет сортировать элементы набора-дерева в обратном порядке Использование настраиваемого компаратора
import java.util.*;
// Обратный компаратор для строк
class MyComp implements Comparator {
public int compare(String a, String b) {
String aStr, bStr;
aStr = a;
bStr = b;
// Обратное сравнение
return b S n r .compareTo(aStr);
}
// Нет необходимости переопределять equals().
}
class CompDemo {
public static void main(String a r g s []) {
// Создать TreeSet.
TreeSet ts = new TreeSet(new M y C o m p ());
// Добавить элементы в набор-дерева.
t
s .a d d СВ .a d d ("D");
// Отобразить элементы
for(String element :
ts)
System.out.print(element + " "Как показывает следующий вывод, дерево теперь отсортировано в обратном порядке Е D СВ А
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 1 Обратите внимание на класс
MyClass, который реализует интерфейс
Compa­
rator и метод compare
(). (Как упоминалось, переопределение метода equals
() не является ни необходимым, ни желательным) Внутри метода compare
() метод compareTo
() объекта класса
String сравнивает две строки. Однако метод compa­
reTo
() вызывает строка bSt га не строка aSt г. Это приводит к тому, что результат сравнения получается обратным.
Следующая программа — более полезная, усовершенствованная версия программы с классом
ТгееМар, сохраняющей балансовые счета. В предыдущей версии счета были отсортированы по владельцу счета, но порядок определялся именем. В следующей программе осуществляется сортировка счетов по фамилиям владельцев. Для этого, она использует компаратор, сравнивающий фамилии каждого владельца счета. В результате получается карта, отсортированная по фамилиям Использование компаратора для сортировки по фамилиям
import java.util.*;
// Сравнивает последние два слова в полной строке
class TComp implements Comparator {
public int compare(String a, String b) {
int i ,
j ,
k;
String aStr, bStr;
aStr = a;
bStr = b;
// Найти индекс символа в строке, с которого начинается фамилия
i = aSt r .lastlndexOf(' ');
j = b S t r .lastlndexOf(' ');
k = aSt r .substring(i ).compareTo(bStr.substring(j ));
if(k==0) // Фамилии совпадают, проверить полное имя
return a S t r .compareTo(bStr);
else
return k;
}
// Нет необходимости переопределять equals().
}
class TreeMapDemo2 {
public static void main(String a r g s []) {
// Создать карту-дерево.
TreeMap
Double> tm = new TreeMap
Double> (new T C o m p ());
// Поместить элементы в карту
tm.put("fl>KOH Доу", new Double (3434 .
34)) Том Смит", new Double(123.22));
tm.put("Джейн Бейкер", new D o uble(1378.00));
tm.put("Tofl Халл", new Doub l e (99.22));
tm.put("Ральф Смит", new Doub l e (-19.08));
// Получить набор элементов Double>> set = tm.entrySet();
// Отобразить элементы Double> me :
set) {
System.out.print(me.getK e y () +
");
System.out.println(me.getValue());
}
System.out.p r incln();
17 3ak 3 03 0

5 1 Часть II. Библиотека Java
// Добавить насчет Джона Доу.
double balance
= Джон Доу "); Джон Доу

", balance + Новый баланс Джона Доу: " +
tm.get("John Вот вывод программы. Обратите внимание на то, что счета теперь отсортированы по фамилиям.
Джейн Бейкер: 137 8.0 Джон Доу: 3 434.34

Ральф Смит: -19.08 Том См и т :

12 3.22
Тод Халл: Новый баланс Джона Доу: Компаратор класса
ТСогпр сравнивает две строки, которые содержат имя и фамилию. Сначала он сравнивает фамилии. Для этого осуществляется поиск позиции последнего пробела в каждой строке с последующим сравнением подстроки, начинающейся с этой позиции. В случае, когда фамилии эквивалентны, сравниваются имена. Это порождает карту-дерево, отсортированную по фамилии, а в пределах одинаковых фамилий — по именам. Вы можете убедиться в этом, поскольку
Ральф Смит в выводе программы находится перед Томом Смитом.
Алгоритмы коллекций
Инфраструктура коллекций определяет несколько алгоритмов, которые могут быть применимы к коллекциями картам. Эти алгоритмы определены как статические методы в классе C o l l e c t i o n s . Они собраны в табл. 17.18. Как упоминалось, начиная с комплекта JDK 5 все алгоритмы были перепроектированы как обобщенные.
Таблица 17.18. Алгоритмы, определенные в классе
C o l l e c t i o n s
Описание
Метод_______________________________
static Т b o o l e a n
addAll ( C o l l e c t i o n s super T> с,
Т. .
элементы Т u e u e < T > a s L i f o Q u e u e ( D e q u e < T > с Т int b i n a r y S e a r c h ( L i s t < ?
ex t ends T> список значение int b i n a r y S e a r c h ( L i s t < ?
Ex t e n d s C o m p a r a b l e < ? s uper T>> список значение
c h e c k e d C o l l e c t i o n ( C o l l e c t i o n < E > с ,
C l a s s < E > Вставляет элементы, переданные в параметре элементы в коллекцию, указанную в параметре с.
Возвращает значение
true, если элементы были добавлены, и значение
false
— в противном случае
Возвращает представление коллекции последний вошел — первый вышел”
Ищет в список значение значение в соответствии с с. Возвращает позицию значение в список или отрицательное значение, если значение не найдено
Ищет в список значение значение Список должен быть отсортирован. Возвращает позицию значение в список или отрицательное значение, если значение не найдено
Возвращает безопасное в отношении типов представление коллекции времени выполнения. Попытка вставить несовместимый элемент вызовет исключение l a s s C a s t E x c e p t i o n _____________________

Продолжение табл. Г. V
,
' Описание

'
.■ Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 1 5
static Е List
checkedList(List с, Class
t)
static M a p < K ,
V>checkedMap(Map c, Class ключТ,
Class
значениеТ)
static List
checkedSet(Set c, Class
t)
static SortedMap
V>checkedSortedMap(SortedMap
V> c, Class
ключТ,
Class значениеТ)
static SortedSet
checkedSortedSet(SortedSet c,
Class
t)
static void copy(List
T
> список список m p t y L i s t O

static ListIterator
emptyListlterator()
static M a p < K ,
V> e m p t y M a p ()
static Set e m p t y S e t ()
static Enuineration
enumeration(Collection Возвращает безопасное в отношении типов представление интерфейса
List времени выполнения. Попытка вставить несовместимый элемент вызовет исключение
ClassCastException
Возвращает безопасное в отношении типов представление интерфейса
Мар времени выполнения. Попытка вставить несовместимый элемент вызовет исключение
ClassCastException
Возвращает безопасное в отношении типов представление интерфейса
Set времени выполнения. Попытка вставить несовместимый элемент вызовет исключение
ClassCastException
Возвращает безопасное в отношении типов представление интерфейса
SortedMap времени выполнения. Попытка вставить несовместимый элемент вызовет исключение
ClassCastException
Возвращает безопасное в отношении типов представление интерфейса
SortedSet времени выполнения. Попытка вставить несовместимый элемент вызовет исключение
ClassCastException
Копирует элементы список2
в спи сок!
Сравнивает элементы вас элементами в Ь. Возвращает значение
true, если две коллекции не содержат общих элементов (те. непере- секающиеся множества элементов. В противном случае возвращает значение Возвращает пустое перечисление, те. перечисление без элементов. (Добавлено в JDK Возвращает пустой итератор, те. итератор без элементов. (Добавлено в Возвращает неизменяемый, пустой объект интерфейса
List заданного типа
Возвращает пустой итератор списка, те. итератор списка без всяких элементов. (Добавлено в JDK Возвращает неизменяемый, пустой объект интерфейса
Мар заданного типа
Возвращает неизменяемый, пустой объект интерфейса
Set заданного типа
Возвращает перечисление на основе
с.
(См. раздел Интерфейс
Enumeration” далее в настоящей главе

5 1 Часть II. Библиотека Java
_____ __________________ Продолжение табл. 17.18
Шмт »:
!-<
f
^


Фяцедине:
: I
ii .
;
.
t
.
static Т void fill(List
Т>список,
T объект с ,
object объект список,
List
вложенныйСписок)
static int
lastlndexOfSubList(List список,
List
вложенныйСписок)
static
ArrayListlist(Enumeration перечисление компаратор
& Comparable
Tmax(Collection c)
static T min(Collection
extends T>
c,
Comparator
T> компаратор
&Comparable
min(Collection c)
static List nCopies(int количество объект Set

newSetFromMap(Map
m)
static boolean список старый T новый void reverse(List
список ComparatorreverseOrd
er(Comparator компаратор
ComparatorreverseOrder()
static void rotate(List список,
1   ...   38   39   40   41   42   43   44   45   ...   90


написать администратору сайта