Реферат по предмету "Информатика, программирование"


Наследование и классы-коллекции

/>/>/>Факультет «Информатика и системы управления»
Методические указания к лабораторной работе
по курсу«Распределенные системы обработки информации»
Наследованиеи классы-коллекции
Москва 2004г.

Оглавление
Цель работы… 3
Задание для домашней подготовки. 3
Задания к лабораторной работе. 3
Задание 1  3
Задание 2  4
Содержание отчета. 4
Контрольные вопросы. 4
Литература. 6
Приложение 1. Спецификация класса Statistics. 7
Приложение 2. Работа со строками. 9
Приложение 3. Классы – коллекции. 20
Приложение 4. Работа с датами и временем. 41
Приложение 5. Файловый ввод/вывод. 43
Приложение 6. Обработка исключений. 48
/>/>Цельработы
1.    Научиться работать с коллекциями иклассами, реализующими интерфейс Collection.
2.    Познакомиться с основными классамипакета java.util.
3.    Освоить работу с системным временем(Класс java.util.Date).
4.    Научиться работать с файлами ипотоками ввода/вывода.
5.    Научиться обрабатывать строки(объекты класса String).
6.    Применить полученные знания напрактике/>/>/>/>Заданиедля домашней подготовки
1.    Ознакомиться с материалом,предоставленным в приложениях к данным методическим указаниям.
2.    Изучить примеры программ, реализующихфайловый ввод/вывод (см. Приложение 5).
3.    Ознакомиться с текстом задания клабораторной работе в соответствии с вариантом и написать программу./>/> Заданияк лабораторной работеЗадание 1
2 варианта:
1)    Написать программу, которая считываеттекст из входного файла, подсчитывает, сколько раз встретился каждый символрусского алфавита, и выводит результат в выходной файл, например, в виде строк“ символ — число”.
2)    Написать программу, которая считываеттекст из входного файла, формирует множество слов и выводит результат ввыходной файл. Одинаковые слова, встретившиеся в тексте, нужно вывести в третийфайл в виде строк “слово — число”.
Для обоих вариантов:
o   Классы – коллекции, с помощью которыхбудет выполнена обработка текста, студент выбирает самостоятельно./>/> Задание2
Строки и файлы [Л.2 нас.107-109]. Номер задания соответствует порядковому номеру в журнале (по модулю20).Содержание отчета
Отчет должен содержать:
1.    Постановку задачи, решаемойотлаженной программой.
2.    Руководство пользователя отлаженнойпрограммы, содержащее описание интерфейсов всех функций программы.
3.    Листинг программы с необходимымикомментариями./>/>Контрольныевопросы
1.    Как изменить кодировку символов (“KOI8_R”, “Cp866”,…) в потоках ввода/вывода?
2.    Как сделать программунечувствительной к регистру символов входного файла?
3.    Как изменить программу, чтобы именавходных/выходных файлов нужно было бы вводить с клавиатуры или задавать вкомандной строке.
4.    Как нужно изменить программу, чтобыпосле объявления метода public static void main(String[]args) не нужно было бы записывать throws IOException.
5.    Как известно, время в приложения Java записывается в виде целочисленныхзначений типа long, выраженных в миллисекундах иотсчитываемых с полуночи (00:00:00 GMT) 1 января 1970 года. На сколько лет хватит размера (8байт) значения типаlong для отсчета миллисекунд?
6.    Как можно изменить программу, чтобыподсчитать время обработки файлов без использования класса Date, введя одну дополнительнуюпеременную.
7.    Как сравнить две строки.
8.    Как выбрать i-ый символ строки./>/> 
Литература
1.        АрнолдК., Гослинг Дж., Холмс Д. Язык программирования Java: Пер. с англ. – М.:Издательский дом «Вильямс», 2001 г. – 624 с., ил.
2.        ПавловскаяТ.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. -СПб.: Питер,2002. -240с.
Дополнительная
1.        Официальныйсайт Java — java.sun.com/ (есть раздел на русском языке с учебником).
2.        Java™ 2 SDK, Standard Edition Documentation — java.sun.com/products/jdk/1.5/index.html.
3.        Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The JavaLanguage Specification — www.javasoft.com/docs/books/jls/). Перевод на русский язык —http://www.uni-vologda.ac.ru/java/jls/index.html
4.        Официальныйсайт проекта Eclipse — www.eclipse.org/.
А также
5.        ДмитрийРамодин. Начинаем программировать на языке Java.
6.        НиколайСмирнов. Java 2: Учебное пособие.
7.        КартузовА. В. Программирование на языке Java.
8.        ВязовикН.А. Программирование на Java.

Приложение1. Спецификация класса Statistics.
import java.io.*;//подключениепакета с классами ввода/вывода
import java.util.*;         //подключениепакета с классами коллекций и времени
public classStatistics {
public staticvoid main(String[] args) throws IOException{
BufferedReaderbr = new BufferedReader(new InputStreamReader(new FileInputStream(«d:\\input.txt»));
//Входной поток — изфайла d:\input.txt
BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(«d:\\output.txt»));
//Выходной поток — в файлd:\output.txt
//инициализацияэкземпляра класса, реализующего интерфейс коллекций
int c = 0;
Date before = new Date();                //зафиксироваливремя перед обработкой
while ((c = br.read()) != -1) {  //пока не достигнутконец файла d:\input.txt
//обработка
/*
например, если ранееопределена строка String s="";
 то можно записать s+=(char)c;
 Тогда все содержимоефайла d:\input.txtбудет записано в строку s
*/
}
br.close(); //закрываем входной поток после чтения ипредварительной обработки
for (/*цикл*/){
//обработка и запись ввыходной поток
bw.write(/*слово*/+" "+/*число*/+"\r\n");                 
}
bw.close(); //закрываем выходной поток после записи файла
Date after = new Date();         //фиксируемвремя после обработки
System.out.println(«Обработкапродолжалась „+(after.getTime()-before.getTime())+“миллисекунд»);
//выводим на консоль времяобработки в миллисекундах                  
} //конец public static void main(String[]args)
} //конец класса Statistics
/>Приложение2. Работа со строками
Очень большое место вобработке информации занимает работа с текстами. Как и многое другое, текстовыестроки в языке Java являются объектами. Они представляются экземплярами класса String или класса StringBuffer.
Зачем в язык введены двакласса для хранения строк? В объектах класса String хранятся строки-константы неизменной длины и содержания. Это значительноускоряет обработку строк и позволяет экономить память, разделяя строку междуобъектами, использующими ее. Длину строк, хранящихся в объектах класса StringBuffer, можно менять, вставляя и добавляястроки и символы, удаляя подстроки или сцепляя несколько строк в одну строку.
Напомним, что символы встроках хранятся в кодировке Unicode, в которой каждый символ занимает двабайта. Тип каждого символа char. />КлассString
Перед работой со строкойее следует создать. Это можно сделать разными способами.
/>Самыйпростой способ создать строку — это организовать ссылку типа String на строку-константу:
String si = «Этострока.»;
Если константа длинная,можно записать ее в нескольких строках текстового редактора, связывая ихоперацией сцепления:
String s2 = «Этодлинная строка, » +
«записанная в двухстроках исходного текста»;
Не забывайте разницумежду пустой строкой Strings = "", несодержащей ни одного символа, и пустой ссылкой String s = null, не указывающей ни на какую строку и не являющейся объектом.
Самый правильный способсоздать объект с точки зрения ООП — это вызвать его конструктор в операции new.Класс String предоставляет девять конструкторов:
·     String() — создается объект с пустой строкой;
·     String(Stringstr) — из одного объектасоздается другой, поэтому этот конструктор используется редко;
·     String(StringBufferstr) — преобразованнаякопия объекта класса StringBuffer;
·     String(byte[]byteArray) — объектсоздается из массива байтов byteArray;
·     String(char []charArray) — объектсоздается из массива charArray символов Unicode;
·     String(byte []byteArray, int offset, int count) — объект создается из части массива байтов byteArray, начинающейся с индекса offset и содержащей countбайтов;
·     String(char []charArray, int offset, int count) — то же, но массив состоит из символов Unicode;
·     String(byte[]byteArray, String encoding) — символы, записанные в массиве байтов, задаются в Unicode-строке, сучетом кодировки encoding;
·     String(byte[]byteArray, int offset, int count, String encoding) — то же самое, но только для частимассива.
При неправильном заданиииндексов offset, countили кодировки encoding возникает исключительная ситуация.
У кириллицы есть, поменьшей мере, четыре кодировки:
·      В MS-DOSприменяется кодировка СР866.
·      В UNIX обычноприменяется кодировка KOI8-R.
·      На компьютерахApple Macintosh используется кодировка MacCyrillic.
·      Есть еще имеждународная кодировка кириллицы ISO8859-5;
Если исходный кириллическийASCII-текст был в одной из этих кодировок, а местная кодировка СР1251, тоUnicode-символы строки Java не будут соответствовать кириллице.
В этих случаяхиспользуются последние два конструктора, в которых параметром encoding указывается, какую кодовую таблицуиспользовать конструктору при создании строки.
Еще один способ создатьстроку — это использовать два статических метода
copyValueOf(char[]charArray) и copyValueOf(char[]charArray, int offset, int length).
Они создают строку позаданному массиву символов и возвращают ее в качестве результата своей работы.Например, после выполнения следующего фрагмента программы
char[] с = ('С', 'и','м', 'в', 'о1, 'л', 'ь', 'н', 'ы', 'й'};
String s1 =String.copyValueOf(с);
String s2 =String.copyValueOf(с, 3, 7);
получим в объекте s1 строку «Символьный», а в объекте s2 — строку «вольный». />Сцеплениестрок
Со строками можнопроизводить операцию сцепления строк, обозначаемую знаком плюс +. Эта операциясоздает новую строку, просто составленную из состыкованных первой и второйстрок. Ее можно применять и к константам, и к переменным. Например:
Stringattention = «Внимание: »;
String s =attention + «неизвестный символ»;
Вторая операция —присваивание += — применяется к переменным в левой части:
attention += s;
Поскольку операция + перегружена со сложения чисел на сцепление строк, встаетвопрос о приоритете этих операций. У сцепления строк приоритет выше, чем усложения, поэтому, записав «2» + 2 + 2, получим строку«222». Но, записав 2 + 2 + «2», получим строку «42»,поскольку действия выполняются слева направо. Если же запишем «2» + (2 + 2), то получим «24». />Манипуляциистроками
В классе String есть множество методов для работы со строками.
/>Как узнать длину строки
Для того чтобы узнатьдлину строки, т. е. количество символов в ней, надо обратиться к методу length():
String s =«Write once, run anywhere.»;
int len = s.length{);
или еще проще
int len =«Write once, run anywhere.».length();
посколькустрока-константа — полноценный объект класса String.Заметьте, что строка — это не массив, у нее нет поля length.
/>Как выбрать символы из строки
Выбрать символ с индексомind (индекс первого символа равен нулю)можно методом charAt(intind) Если индекс ind отрицателен или не меньше чем длина строки, возникаетисключительная ситуация.
Все символы строки в видемассива символов можно получить методом toCharArray(), возвращающим массив символов.
Если же надо включить вмассив символов dst, начиная с индекса ind массива подстроку от индекса begin включительно до индекса end исключительно, то используйте метод getChars(int begin, int end, char[]dst, int ind) типа void.
В массив будет записано end — begin символов, которые займут элементымассива, начиная с индекса ind до индекса ind + (end — begin) — 1.
Если надо получить массивбайтов, содержащий все символы строки в байтовой кодировке ASCII, тоиспользуйте метод getBytes().
Этот метод при переводесимволов из Unicode в ASCII использует локальную кодовую таблицу.
Если же надо получитьмассив байтов не в локальной кодировке, а в какой-то другой, используйте метод getBytes(String encoding).
/>Как выбрать подстроку
Метод substring(int begin, int end) выделяет подстроку от символа синдексом begin включительно до символа с индексом end исключительно. Длина подстроки будет равна end — begin.
Метод substring (int begin) выделяет подстроку от индекса begin включительно до конца строки.
Если индексыотрицательны, индекс end больше длины строки или begin больше чем end,то возникает исключительная ситуация.
Например, после выполнения
String s =«Write onсe, run anywhere.»;
String sub1 =s.substring(6, 10);
String sub2 =s.substring(16);
получим в строке sub1 значение «once», а в sub2 — значение «anywhere».
/>Как сравнить строки
Операция сравнения == сопоставляет только ссылки на строки. Она выясняет,указывают ли ссылки на одну и ту же строку. Например, для строк
String s1 =«Какая-то строка»;
String s2 =«Другая-строка»;
сравнение s1 == s2 дает в результате false.
Значение true получится, только если обе ссылки указывают на одну иту же строку, например, после присваивания si = s2.
Интересно, что если мыопределим s2 так:
String s2 ==«Какая-то строка»;
то сравнение s1 == s2 даст в результате true, потому что компилятор создаст только один экземплярконстанты «Какая-то строка» и направит на него все ссылки.
Для сравнения содержимогострок есть несколько методов.
Логический метод equals (Object obj), переопределенный из класса Оbject, возвращает true,если аргумент obj не равен null, является объектом класса String,и строка, содержащаяся в нем, полностью идентична данной строке вплоть досовпадения регистра букв. В остальных случаях возвращается значение false.
Логический метод equalsIgnoreCase(Object obj) работает так же, но одинаковые буквы,записанные в разных регистрах, считаются совпадающими.
Метод compareTo(string str) возвращает целое число типа int, вычисленное по следующим правилам:
1.    Сравниваются символы данной строки this и строки str содинаковым индексом, пока не встретятся различные символы с индексом, допустим k, или пока одна из строк не закончится.
2.    В первом случае возвращается значениеthis.charAt(k) — str.charAt(k), т. е.разность кодировок Unicode первых несовпадающих символов.
3.    Во втором случае возвращается значениеthis.length() — str.length(), т. е.разность длин строк.
4.    Если строки совпадают, возвращается0.
Если значение str равно null,возникает исключительная ситуация.
Нуль возвращается в тойже ситуации, в которой метод equals()возвращает true.
Метод compareToignoreCase(string str) производит сравнение без учетарегистра букв, точнее говоря, выполняется метод
this.toUpperCase().toLowerCase().compareTo(
str.toUpperCase().toLowerCase());
Еще один метод— compareTo (Object obj) создает исключительную ситуацию,если obj не является строкой. В остальном онработает как метод compareTo(Stringstr).
Эти методы не учитываюталфавитное расположение символов в локальной кодировке.
Русские буквы расположеныв Unicode по алфавиту, за исключением одной буквы. Заглавная буква Ёрасположена перед всеми кириллическими буквами, ее код '\u040l', а строчная буква е — после всех русских букв, еекод '\u0451'.
/>Кодировкирусских букв:
‘А’ ~ 1040 ~ \u410
‘Я’~ 1071 ~ \u42F
‘а’ ~ 1072 ~ \u430
‘я’ ~ 1103 ~ \u44F
Как найти символ в строке
Поиск всегда ведется сучетом регистра букв.
Первое появление символа ch в данной строке thisможно отследить методом indexOf(intch), возвращающим индексэтого символа в строке или -1, если символа ch в строке this нет.
Например, «Молоко», indexOf('о') выдаст в результате 1.
Второе и следующиепоявления символа ch в данной строке this можно отследить методом indexOf(int ch, int ind).
Этот метод начинает поисксимвола ch с индекса ind. Если ind
Последнее появлениесимвола ch в данной строке this отслеживает метод lastIndexof (int ch). Он просматривает строку в обратномпорядке. Если символ ch не найден,возвращается.-1.
Предпоследнее ипредыдущие появления символа ch в данной строкеthis можно отследить методом lastIndexof(int ch, int ind), который просматривает строку вобратном порядке, начиная с индекса ind.
Если ind больше длины строки, то поиск идёт от конца строки,если ind
/>Как найти подстроку
Поиск всегда ведется сучетом регистра букв.
Первое вхождениеподстроки sub в данную строку this отыскивает метод indexof(String sub). Он возвращает индекс первого символапервого вхождения подстроки sub в строку или-1, если подстрока sub не входит в строку this.
Если вы хотите начатьпоиск не с начала строки, а с какого-то индекса ind, используйте метод indexOf (String sub, int ind). если ind
Последнее вхождениеподстроки sub в данную строку this можно отыскать методом lastindexof (string sub),возвращающим индекс первого символа последнего вхождения подстроки sub в строку thisили (-1), если подстрока sub не входит в строку this.
Последнее вхождениеподстроки sub не во всю строку this, а только в ее начало до индекса ind можно отыскать методом lastIndexof(String stf, int ind). Если indбольше длины строки, то поиск идет от конца строки, если ind
Перечисленные выше методысоздают исключительную ситуацию, если
sub == null.
Если вы хотитеосуществить поиск, не учитывающий регистр букв, измените предварительно регистрвсех символов строки.
/>Как изменить регистр символов
Метод toLowerCase ()возвращает новую строку, в которой все буквы переведены в нижний регистр, т. е.сделаны строчными.
Метод toUpperCase () возвращает новую строку, в которойвсе буквы переведены в верхний регистр, т. е. сделаны прописными.
При этом используетсялокальная кодовая таблица по умолчанию. Если нужна другая локаль, топрименяются методы toLowerCase(Locale loc) и toUpperCase(Locale loc).
/>Как заменить отдельный символ
Метод replace (int old, int new) возвращает новую строку, в которойвсе вхождения символа old заменены символом new. Если символа old встроке нет, то возвращается ссылка на исходную строку.
Например, послевыполнения «Рука вруку сует хлеб», replace ('у', 'е') получим строку «Река в реке сеет хлеб».
Регистр букв при заменеучитывается.
/>Как убрать пробелы в начале и концестроки
Метод trim() возвращает новую строку, в которой удаленыначальные и конечные символы с кодами, не превышающими '\u0020'.
/>Как преобразовать данные другоготипа в строку
В языке Java принятосоглашение — каждый класс отвечает за преобразование других типов в тип этогокласса и должен содержать нужные для этого методы.
Класс String содержит восемь статических методов valueof (type elem) преобразования в строку примитивныхтипов boolean, char,int, long, float, double,массива char[], и просто объекта типа Object.
Девятый метод valueof(char[] ch, int offset, intlen) преобразует встроку подмассив массива ch, начинающийся с индекса offset и имеющий lenэлементов.
Кроме того, в каждомклассе есть метод toString(), переопределенный илипросто унаследованный от класса Object.Он преобразует объекты класса в строку. Фактически, метод valueOf() вызывает метод toString() соответствующего класса. Поэтомурезультат преобразования зависит от того, как реализован метод toString().
Еще один простой способ —сцепить значение elem какого-либо типа с пустой строкой: "" + elem. При этом неявно вызывается метод elem.toString (). />/>Синтаксическийразбор строки
Задача разбора введенноготекста — вечная задача программирования, наряду с сортировкой и поиском.
В пакет java.util входит простой класс StringTokenizer, облегчающий разбор строк.
/>Класс StringTokenizer
Класс StringTokenizer из пакета java.util небольшой, в нем три конструктора и шесть методов.
Первый конструктор StringTokenizer (String str) создает объект, готовый разбитьстроку str на слова, разделенные пробелами,символами табуляций '\t', перевода строки '\n' и возврата каретки '\r'. Разделители не включаются в число слов.
Второй конструктор StringTokenizer (String str, String delimeters) задает разделители вторым параметром delimeters,например:
StringTokenizer(«Казнить, нельзя: пробелов-нет»," \t\n\r,:-");
Здесь первый разделитель— пробел. Потом идут символ табуляции, символ перевода строки, символ возвратакаретки, запятая, двоеточие, дефис. Порядок расположения разделителей в строке delimetersне имеет значения. Разделители не включаются в число слов.
Третий конструкторпозволяет включить разделители в число слов:
StringTokenizer(Stringstr, String delimeters, boolean flag);
В разборе строки на словаактивно участвуют следующие методы:
o метод nextToken() возвращает в виде строки следующее слово.
o метод hasMoreTokens() возвращает true, если встроке еще есть слова, и false, если слов больше нет.
o метод countTokens() возвращает число оставшихся слов.
o метод nextToken(string newDelimeters) позволяет «на ходу» менять разделители. Следующее слово будетвыделено по новым разделителям newDelimeters; новые разделители действуют далеевместо старых разделителей, определенных в конструкторе или предыдущем методе nextToken().
o методы nextElement() и hasMoreElements()реализуют интерфейс Enumeration. Онипросто обращаются к методам nextToken() и hasMoreTokens().
Пример. Разбиение строкина слова:
String s = «Строка,которую мы хотим разобрать на слова»;
StringTokenizerst = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Получаем слово ичто-нибудь делаем с ним, например,
// просто выводим наэкран
System.out.println(st.nextToken());
}
Полученные слова обычнозаносятся в какой-нибудь класс-коллекцию: Vector, Stack или другой, наиболее подходящий для дальнейшей обработки текстаконтейнер. Классы-коллекции мы рассмотрены далее.
/>
Приложение 3. Классы – коллекции
При решениизадач, в которых количество элементов заранее неизвестно, элементы надо частоудалять и добавлять используются коллекции.
В языке Javaс самых первых версий есть класс Vector, предназначенный для храненияпеременного числа элементов самого общего типа Object.Класс Vector
В классе Vector из пакета java.utilхранятся элементы типа Object, а значит, любого типа. Количествоэлементов может быть любым и наперед не определяться. Элементы получают индексы0, 1, 2,… К каждому элементу вектора можно обратиться по индексу, как и кэлементу массива.
Кромеколичества элементов, называемого размером (size) вектора, есть еще размербуфера — емкость (capacity) вектора. Обычно емкость совпадает с размером вектора,но можно ее увеличить методом ensureCapacity(intminCapacity) илисравнять с размером вектора методом trimToSize().
Каксоздать вектор
В классечетыре конструктора:
Vector () — создает пустой объект нулевойдлины;
Vector (intcapacity) — создает пустойобъект указанной емкости capacity;
Vector (intcapacity, int increment)— создает пустой объект указанной емкости capacity и задает число increment, на которое увеличивается емкостьпри необходимости;
vector(Collection с) — векторсоздается по указанной коллекции. Если capacity отрицательно, создается исключительная ситуация. После создания вектораего можно заполнять элементами.
Какдобавить элемент в вектор
Метод add (Object element) позволяет добавить элемент в конецвектора.
Методом add (int index, Object element) можно вставить элемент в указанное место index. Элемент, находившийся на этом месте, и всепоследующие элементы сдвигаются, их индексы увеличиваются на единицу.
Метод addAll (Collection coll) позволяет добавить в конец вектора все элементы коллекции coll.
Методом addAll(int index, Collection coll) возможно вставить в позицию index все элементы коллекции coll.
Какзаменить элемент
Метод set (int index, Object element) заменяет элемент, стоявший в векторев позиции index, на элемент element.
Как узнатьразмер вектора
Количествоэлементов в векторе всегда можно узнать методом size(). Метод capacity()возвращает емкость вектора.
Логическийметод isEmpty() возвращает true, если в векторе нет ни одного элемента.
Какобратиться к элементу вектора
Обратиться кпервому элементу вектора можно методом firstElement(), к последнему — методом lastElement(),к любому элементу — методом get(int index).
Эти методывозвращают объект класса Object. Перед использованием его следуетпривести к нужному типу.
Получить всеэлементы вектора в виде массива типа Object[] можно методами toArray) и toArray (Object [] а). Второй метод заносит все элементы вектора в массива, если в нем достаточно места.
Какузнать, есть ли элемент в векторе
Логическийметод contains (Objectelement) возвращает true, если элемент elementнаходится в векторе.
Логическийметод containsAll (Collection с) возвращает true, если вектор содержит все элементы указаннойколлекции.
Как узнатьиндекс элемента
Четыре методапозволяют отыскать позицию указанного элемента element:
indexOf (Object element) — возвращает индекс первогопоявления элемента в векторе;
indexOf(Object element, int begin) — ведет поиск, начиная с индекса beginвключительно;
lastindexOf(Object element) — возвращаетиндекс последнего появления элемента в векторе;
lastindexOf(Object element, int start) — ведет поиск от индекса startвключительно к началу вектора.
Если элементне найден, возвращается —1.
Какудалить элементы
Логическийметод remove (Objectelement) удаляет извектора первое вхождение указанного элемента element. Метод возвращает true,если элемент найден и удаление произведено.
Метод remove (int index) удаляет элемент из позиции index и возвращает его в качестве своего результата типа Object.
Удалитьдиапазон элементов можно методом removeRange(int begin, int end), не возвращающим результата. Удаляются элементы отпозиции begin включительно до позиции end исключительно.
Удалить изданного вектора все элементы коллекции coll возможнологическим Методом removeAll(Collectioncoll).
Удалитьпоследние элементы можно, просто урезав вектор методом
setSizefintnewSize).
Удалить всеэлементы, кроме входящих в указанную коллекцию coll, разрешает логический метод retainAll(Collection coll).
Удалить всеэлементы вектора можно методом clear()или обнуливразмервектораметодомsetSize(O).
Данныйлистинг дополняет пример, записанный в приложении 2, обрабатывая выделенные изстроки слова с помощью вектора.
Работа с вектором
Vector v =new Vector();
String s =«Строка, которую мы хотим разобрать на слова.»;
StringTokenizerst = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Получаемслово и заносим в вектор
v.add(st.nextToken());// Добавляем в конец вектора
}
System.out.println(v.firstElement());// Первый элемент
System.out.println(v.lastElement());// Последний элемент
v.setSize(4);// Уменьшаем число элементов
v.add(«собрать.»);// Добавляем в конец
//укороченного вектора
v.set(3, «опять»);// Ставим в позицию 3
for(int i = 0; i
System.out.print(v.get(i)+ " ");
System.out.println();
Класс Vector является примером того, как можно объекты класса Object, a значит, любые объекты, объединить в коллекцию.Этот тип коллекции упорядочивает и даже нумерует элементы. В векторе естьпервый элемент, есть последний элемент. К каждому элементу обращаютсянепосредственно по индексу. При добавлении и удалении элементов оставшиесяэлементы автоматически перенумеровываются.
Второй примерколлекции — класс Stack — расширяет кладе Vector. Класс Stack
Класс Stack из пакета java.util. объединяет элементы в стек.
Стек (Stack)реализует порядок работы с элементами подобно магазину винтовки— первымвыстрелит патрон, положенный в магазин последним,— или подобно железнодорожномутупику — первым из тупика выйдет вагон, загнанный туда последним. Такой порядокобработки называется LIFO (Last In — First Out).
Перед работойсоздается пустой стек конструктором Stack ().
Затем на стеккладутся и снимаются элементы, причем доступен только «верхний»элемент, тот, что положен на стек последним.
Дополнительнок методам класса vector класс Stack содержит пять методов, позволяющих работать с коллекцией как со стеком:
push (Objectitem) —помещает элемент item в стек;
pop () — извлекает верхний элемент изстека;
peek () — читает верхний элемент, не извлекаяего из стека;
empty () — проверяет, не пуст ли стек;
search(Object item) — находитпозицию элемента item в стеке. Верхний элемент имеетпозицию 1, под ним элемент 2 и т. д. Если элемент не найден, возвращается — 1.
Еще одинпример коллекции совсем другого рода — таблицы — предоставляет класс Hashtable.Класс Hashtable
Класс Hashtable расширяет абстрактный класс Dictionary. В объектах этого класса хранятсяпары «ключ — значение».
Из таких пар«Фамилия И. О. — номер» состоит, например, телефонный справочник.
Каждый объекткласса Hashtable кроме размера (size) — количествапар, имеет еще две характеристики: емкость (capacity) — размер буфера, и показательзагруженности (load factor) — процент заполненности буфера, по достижениикоторого увеличивается его размер.
Каксоздать таблицу
Для созданияобъектов класс Hashtable предоставляет четыре конструктора:
Hashtable() — создает пустой объект с начальнойемкостью в 101 элемент и показателем загруженности 0,75;
Hashtable(int capacity) — создаетпустой объект с начальной емкостью capacity и показателем загруженности 0,75;
Hashtable(intcapacity, float loadFactor) — создает пустой Объект с начальной емкостью capacity и показателем загруженности loadFactor;
Hashtable(Map f) — создает объекткласса Hashtable, содержащий все элементы отображенияf, с емкостью, равной удвоенному числуэлементов отображения f, но не менее 11, и показателемзагруженности 0,75.
Какзаполнить таблицу
Длязаполнения объекта класса Hashtableиспользуются два метода:
Objectput(Object key, Object value) — добавляет пару «key — value»,если ключа key не было в таблице, и меняет значениеvalue ключа key, если он уже есть в таблице. Возвращает старое значение ключа или null, если его не было. Если хотя бы один параметр равен null, возникает исключительная ситуация;
voidputAll(Map f) —добавляет все элементы отображения f. Вобъектах-ключах key должны быть реализованы методы hashCode() и equals ().
Какполучить значение по ключу
Метод get (Object key) возвращает значение элемента сключом key в виде объекта класса Object. Для дальнейшей работы его следует преобразовать кконкретному типу.
Как узнатьналичие ключа или значения
Логическийметод containsKey(Objectkey) возвращает true, если в таблице есть ключ key.
Логическийметод containsvalue(Object value) илистарый метод contains(Object value)возвращают true, если в таблице есть ключи созначением value.
Логическийметод isEmpty() возвращает true, если в таблице нет элементов.
/>Как получить все элементы таблицы
Метод values()представляет все значения value таблицы в виде интерфейса Collection. Все модификации в объекте collection изменяют таблицу, и наоборот.
Метод keyset() предоставляет все ключи key таблицы в виде интерфейса set. Все изменения в объекте set корректируют таблицу, и наоборот.
Метод entrySet() представляет все пары «key — value» таблицы в виде интерфейса Set. Все модификации в объекте Setизменяют таблицу, и наоборот.
Метод toString()возвращает строку, содержащую все пары.
/>Как удалить элементы
Метод remove (Object key) удаляет пару с ключом key, возвращая значение этого ключа, если оно есть, и null, если пара с ключом key не найдена.
Метод clear() удаляет все элементы, очищая таблицу.
Примерпрограммы «Телефонный справочник».
import java.util.*;
classPhoneBook{
publicstatic void main(String[] args){
Hashtableyp = new Hashtable();
Stringname = null;
yp.put(«John»,«123-45-67»);
yp.put(«Lemon», «567-34-12»);
yp.put(«Bill»,«342-65-87»);
yp.put(«Gates»,«423-83-49»);
yp.put(«Batman»,«532-25-08»);
try{
name= args[0];
}
catch(Exceptione){
System.out.println(«Usage:Java PhoneBook Name»);
}
return;
}
if(yp.containsKey(name))
System.out.println(name+ "'s phone = " + yp.get(name));
else
System.out.println(«Sorry,no such name»);
)
} />Класс Properties
Класс Properties расширяет класс Hashtable. Он предназначен в основном для ввода и вывода пар свойствсистемы и их значений. Пары хранятся в виде строк типа String. В классе Properties два конструктора:
Properties() — создает пустой объект;
Properties(Properties default) — создаетобъект с заданными парами свойств default.
Кроме унаследованныхот класса Hashtable методов в классе Properties есть еще следующие методы.
Два метода,возвращающих значение ключа-строки в виде строки:
• String getProperty (Stringkey) — возвращает значение по ключу key;
• StringgetProperty(String.key, String defaultValue) — возвращает значение по ключу key; если такогоключа нет, возвращается defaultValue.
Метод setProperty(String key, String value) добавляет новую пару, если ключа key нет, и меняет значение, если ключ key есть.
Метод load(Inputstream in) загружает свойства из входногопотока in.
Методыlist(PrintStream out) И list (PrintWriter out) выводят свойства в выходнойпоток out.
Метод store (OutputStream out, Stringheader) выводит свойствав выходной поток out с заголовком header.
/>
Рисунок. Иерархия классов иинтерфейсов-коллекций.
Примерыклассов Vector, Stack,Hashtable, Propertiesпоказывают удобство классов-коллекций. Поэтому в Java 2 разработана целаяиерархия коллекций. Она показана на рисунке. Справа записаны имена интерфейсов.Стрелки указывают классы, реализующие эти интерфейсы. Все коллекции разбиты натри группы, описанные в интерфейсах List, Set и Map.
Примеромреализации интерфейса List может служить класс Vector, примером реализации интерфейса мар — класс Hashtable.
Коллекции List и Set имеют многообщего, поэтому их общие методы объединены и вынесены в суперинтерфейс Collection. />ИнтерфейсCollection
Интерфейс collection из пакета java.util описывает общие свойства коллекций List и Set. Он содержитметоды добавления и удаления элементов, проверки и преобразования элементов:
boolean add(Object obj) — добавляетэлемент obj в конец коллекции; возвращает false, если такой элемент в коллекции уже есть, а коллекцияне допускает повторяющиеся элементы; возвращает true, если добавление прошло удачно;
booleanaddAll (Collection coll)— добавляет все элементы коллекции coll вконец данной коллекции;
void clear() — удаляет все элементы коллекции;
booleancontains (Object obj) —проверяет наличие элемента obj в коллекции;
booleancontainsAll (Collection coll) — проверяет наличие всех элементов коллекции coll в данной коллекции;
booleanisEmpty() — проверяет,пуста ли коллекция;
iterator iterator() — возвращает итераторданной коллекции;
booleanremove (Object obj) —удаляет указанный элемент из коллекции; возвращает false, если элемент не найден, true, если удаление прошло успешно;
booleanremoveAll (Collection coll) — удаляет элементы указанной коллекции, лежащие в данной коллекции;
booleanretainAll (Collection coll) — удаляет все элементы данной коллекции, кроме элементов коллекции coll;
int size () — возвращает количество элементов вколлекции;
Object []toArray() — возвращаетвсе элементы коллекции в виде массива;
ObjectntoArray(Object[] a) —записывает все элементы коллекции в массив а, если в нем достаточно места. />Интерфейс List
Интерфейс List из пакета java.util, расширяющий интерфейс Collection,описывает методы работы с упорядоченными коллекциями. Иногда их называют последовательностями(sequence). Элементы такой коллекциипронумерованы, начиная от нуля, к ним можно обратиться по индексу. В отличие отколлекции Set элементы коллекции List могут повторяться.
Класс Vector — одна из реализаций интерфейса List.
Интерфейс List добавляет к методам интерфейса Collection методы, использующие индекс index элемента:
void add(intindex, Object obj) —вставляет элемент obj в позицию index; старые элементы, начиная с позиции index, сдвигаются, их индексы увеличиваются на единицу;
booleanaddAll(int index, Collection coll) — вставляет все элементы коллекции coll;
Objectget(int index) —возвращает элемент, находящийся в позиции index;
intindexOf(Object obj) —возвращает индекс первого появления элемента obj в коллекции;
intlastindexOf (Object obj)— возвращает индекс последнего появления элемента obj в коллекции;
Listiteratorlistiterator () —возвращает итератор коллекции;
Listiteratorlistiterator (int index)— возвращает итератор конца коллекцииот позицииindex;
Object Set(int index, Object obj)— заменяет элемент, находящийся в позиции index,элементом obj;
ListsubListUnt from, int to)— возвращает часть коллекции от позиции fromвключительно до позиции to исключительно. />Интерфейс Set
Интерфейс Set из пакета java.util, расширяющий интерфейс Collection,описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Этосоответствует математическому понятию множества (Set). Такие коллекции удобны для проверки наличия или отсутствия у элементасвойства, определяющего множество. Новые методы в интерфейс Set не добавлены, просто метод add () не станет добавлять еще одну копию элемента, еслитакой элемент уже есть в множестве.
Этотинтерфейс расширен интерфейсом SortedSet. />ИнтерфейсSortedSet
Интерфейс SortedSet из пакета java.util, расширяющий интерфейс Set, описывает упорядоченное множество, отсортированное поестественному порядку возрастания его элементов или по порядку, заданномуреализацией интерфейса Comparator.
Элементы ненумеруются, но есть понятие первого, последнего, большего и меньшего элемента.
Дополнительныеметоды интерфейса отражают эти понятия:
Comparator comparator () — возвращает способ упорядоченияколлекции; Objectfirst()— возвращаетпервый, меньший элемент коллекции;
SortedSetheadSet (Object toElement) — возвращает начальные, меньшие элементы до элемента toElement исключительно;
Object last() — возвращаетпоследний, больший элемент коллекции;
SortedSetsubSet(Object fromElement, Object toElement) — возвращает подмножество коллекции от элемента fromElement включительно до элемента toElement исключительно;
SortedSettailSet (Object fromElement) — возвращает последние, большие элементы коллекции от элемента fromElement включительно. Интерфейс Map
Интерфейс Map из пакета java.util описывает коллекцию, состоящую из пар «ключ — значение». Укаждого ключа только одно значение, что соответствует математическому понятиюоднозначной функции или отображения.
Такуюколлекцию часто называют еще словарем (dictionary) или ассоциативным массивом (associativearray).
Обычныймассив — простейший пример словаря с заранее заданным числом элементов. Этоотображение множества первых неотрицательных целых чисел на множество элементовмассива, множество пар «индекс массива – элемент массива».
Класс HashTable — одна из реализаций интерфейса мар.
Интерфейс Map содержит методы, работающие с ключами и значениями:
booleancontainsKey (Object key) — проверяет наличиеключа key;
booleancontainsValue (Object value) — проверяет наличиезначения value;
Set entrySet() — представляетколлекцию в виде множества, каждый элемент которого — пара из данногоотображения, с которой можно работать методами вложенного интерфейса Map.Entry;
Object get(Object key) —возвращает значение, отвечающее ключу key;
Set keySet() — представляет ключи коллекции ввиде множества;
Object put(Object key, Object value) — добавляет пару «key— value», если такой пары не было, изаменяет значение ключа key, если такой ключ уже есть вколлекции;
void putAll(Map m) — добавляет кколлекции все пары из отображения m;
Collectionvalues() — представляетвсе значения в виде коллекции.
В интерфейс Mар вложен интерфейс Map.Entry, содержащий методы работы с отдельной парой. Интерфейс SortedMap
Интерфейс SortedMap, расширяющий интерфейс Map, описывает упорядоченную по ключам коллекцию мар.Сортировка производится либо в естественном порядке возрастания ключей, либо, впорядке, описываемом в интерфейсе Comparator.
Элементы ненумеруются, но есть понятия большего и меньшего из двух элементов, первого,самого маленького, и последнего, самого большого элемента коллекции. Этипонятия описываются следующими методами:
Comparator comparator () — возвращает способ упорядоченияколлекции;
ObjectfirstKey() — возвращаетпервый, меньший элемент коллекции;
SortedMapheadMap(Object toKey) — возвращаетначало коллекции до элемента с ключом toKey исключительно;
ObjectlastKey() — возвращаетпоследний, больший ключ коллекции;
SprtedMapsubMap (Object fromKey, Object toKey) — возвращает часть коллекции от элемента с ключомfromKey включительно до элемента с ключом toKey исключительно;
SortedMaptallMap (Object fromKey)— возвращает остаток коллекции от элемента fromKeyвключительно.
Вы можетесоздать свои коллекции, реализовав рассмотренные интерфейсы. Это дело трудное,поскольку в интерфейсах много методов. Чтобы облегчить эту задачу, в Java APIвведены частичные реализации интерфейсов — абстрактные классы-коллекции. />Абстрактныеклассы-коллекции
Эти классылежат в пакетеjava.util,
Абстрактныйкласс AbstractGollection реализует интерфейс Collection, но оставляет нереализованнымиметоды iterator (), size ().
Абстрактныйкласс AbstractList реализует интерфейс List, но оставляет нереализованным метод get() и унаследованный метод size() Этот класс позволяет реализовать коллекцию спрямым доступом кэлементам, подобно массиву
Абстрактныйкласс AbstractSequentialList реализует интерфейс List, но оставляет нереализованным метод listiterator(int index) и унаследованный метод size(). Данный класс позволяет реализовать коллекции с последовательнымдоступом к элементам с помощью итератора Listiterator
Абстрактныйкласс AbstractSet реализует интерфейс Set, но оставляет нереализованными методы, унаследованныеот AbstractCollection
Абстрактныйкласс AbstractMap реализует интерфейс Map, но оставляет нереализованным метод entrySet (),
Наконец, всоставе Java API есть полностью реализованные классы-коллекции помимо ужерассмотренных классов Vector, Stack, Hashtable и Properties, Это классы ArrayList, LinkedList, HashSet,TreeSet, HashMap, TreeMap, WeakHashMap,
Для работы сэтими классами разработаны интерфейсы Iterator,
Listiterator,Comparator И классыArrays И Collections.
Перед тем какрассмотреть использование данных классов, обсудим понятие итератора. />ИнтерфейсIterator
В 90-х годахбыло решено заносить данные в определенную коллекцию, скрыв ее внутреннююструктуру, а для работы с данными использовать методы этой коллекции.
В частности,задачу обхода возложили на саму коллекцию. В Java API введен интерфейс Iterator, описывающий способ обхода всехэлементов коллекции. В каждой коллекции есть метод iterator(), возвращающий реализацию интерфейса Iterator для указанной коллекции. Получив эту реализацию, можно обходитьколлекцию в некотором порядке, определенном данным итератором, с помощьюметодов, описанных в интерфейсе Iterator и реализованных в этом итераторе. Подобная техника использована в классеStringTokenizer.
В интерфейсе Iterator описаны всего три метода:
o   логический метод hasNext () возвращает true, если обход еще не завершен;
o   метод next() делает текущим следующий элемент коллекции и возвращает его в видеобъекта класса Object;
o   метод remove() удаляет текущий элемент коллекции.
Можнопредставить себе дело так, что итератор — это указатель на элемент коллекции.При создании итератора указатель устанавливается перед первым элементом, метод next() перемещает указатель на первый элемент и показываетего. Следующее применение метода next()перемещает указатель на второй элемент коллекции и показывает его. Последнееприменение метода next() выводит указатель за последнийэлемент коллекции.
Метод remove(), пожалуй, излишен, он уже неотносится к задаче обхода коллекции, но позволяет при просмотре коллекцииудалять из нее ненужные элементы.
Пример. Использование итератора вектора
Vector v =new Vector();
String s =«Строка, которую мы хотим разобрать на слова.»;
StringTokenizerst = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Получаемслово и заносим в вектор.
v.add(st.nextToken());// Добавляем в конец вектора }
System.out.print*Ln(v.firstElement(});// Первый элемент
System.out.println(v.lastElement());// Последний элемент
v.SetSize(4);// Уменьшаем число элементов
v.add(«собрать.»);// Добавляем в конец укороченного вектора
v.Set(3,«опять»); // Ставим в позицию 3
for(int i = 0; i
System.out.print(v.get(i)+ ".");
System.out.println(};
Iteratorit = v.Iterator (); // Получаем итератор вектора
try{
while(it.hasNext())// Пока в векторе есть элементы,
System.out.println(it.next());// выводим текущий элемент
}catch(Exceptione){} />Интерфейс Listlterator
Интерфейс ListIterator расширяет интерфейс Iterator, обеспечивая перемещение поколлекции как в прямом, так и в обратном направлении. Он может быть реализовантолько в тех коллекциях, в которых есть понятия следующего и предыдущегоэлемента и где элементы пронумерованы.
В интерфейс ListIterator добавлены следующие методы:
void add(Object element) —добавляет элемент element перед текущим элементом;
booleanhasPrevious() —возвращает true, если в коллекции есть элементы,стоящие перед текущим элементом;
intnextindex() — возвращаетиндекс текущего элемента; если текущим является последний элемент коллекции,возвращает размер коллекции;
Objectprevious() — возвращаетпредыдущий элемент и делает его текущим;
int previousindex() — возвращаетиндекс предыдущего элемента;
void Set(Object element) — заменяеттекущий элемент элементом element;
выполняетсясразу после next() или previous().
Как видите,итераторы могут изменять коллекцию, в которой они работают, добавляя, удаляя изаменяя элементы. Чтобы это не приводило к конфликтам, предусмотренаисключительная ситуация, возникающая при попытке использования итераторовпараллельно «родным» методам коллекции. Именно поэтому в следующемпримере действия с итератором заключены в блок try(){}— catch(){}.
Пример сиспользованием итератора ListIterator.
Vector v =new Vector();
String s =«Строка, которую мы хотим разобрать на слова.»;
StringTokenizerst = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Получаемслово и заносим в вектор
v.add(st.nextToken());// Добавляем в конец вектора
}
ListIteratorlit = v.listlterator(); // Получаем итератор вектора
// Указательсейчас находится перед началом вектора
try{
while(lit.hasNext())// Пока в векторе есть элементы
System.out.println(lit.next());// Переходим к следующему
// элементу ивыводим его
// Теперьуказатель за концом вектора. Пройдем к началу
while(lit.hasPrevious())System.out.println(lit.previous());
}
catch (Exception e) {}
Посмотримтеперь, какие возможности предоставляют классы-коллекции Java2. />Классы,создающие списки
Класс ArrayList полностью реализует интерфейс List и итератор типа Iterator. Класс ArrayList очень похож на класс Vector, имеет тот же набор методов и может использоваться втех же ситуациях.
В классе ArrayList три конструктора;
ArrayList()— создает пустой объект;
ArrayList(Collectioncoll) — создает объект,содержащий все элементы коллекции coll;
ArrayList(int initCapacity) — создает пустойОбъект емкостиinitCapacity.
Единственноеотличие класса ArrayList от класса Vector заключается в том, что класс ArrayList не синхронизован. Это означает что одновременноеизменение экземпляра этого класса несколькими подпроцессами приведет кнепредсказуемым результатам. />/>Сравнениеэлементов коллекций
Интерфейс Comparator описывает два метода сравнения:
int compare (Object obji,Object obj2) —возвращает отрицательное число, если obj1 в каком-то смысле меньше obj2; нуль, если они считаются равными;положительное число, если obj1 больше obj2. Этот метод сравненияобладает свойствами тождества, антисимметричности и транзитивности;
booleanequals (Object obj) —сравнивает данный объект с объектом obj,возвращая true, если объекты совпадают в каком-либосмысле, заданном этим методом.
Для каждойколлекции можно реализовать эти два метода, задав конкретный способ сравненияэлементов, и определить объект класса SortedMap вторым конструктором. Элементы коллекции будут автоматическиотсортированы в заданном порядке. />Классы,создающие множества
Класс HashSet полностью реализует интерфейс Set и итератор типа Iterator. Класс HashSet используется в тех случаях, когданадо хранить только одну копию каждого элемента.
В классе HashSet четыре конструктора:
HashSet() — создает пустой объект споказателем загруженности 0,75;
HashSet (intcapacity) — создаетпустой объект с начальной емкостью capacity и показателем загруженности 0,75;
HashSet (intcapacity, float loadFactor) — создает пустой объект с начальной емкостью capacity и показателем загруженности loadFactor;
HashSet(Collection coll) —создает объект, содержащий все элементы коллекции coll, с емкостью, равной удвоенному числу элементовколлекции coll, но не менее 11, и показателемзагруженности 0,75. />Упорядоченныемножества
Класс TreeSet полностью реализует интерфейс SortedSet и итератор типа Iterator. Класс TreeSet реализован как бинарное дерево поиска, значит, егоэлементы хранятся в упорядоченном виде. Это значительно ускоряет поиск нужногоэлемента.
Порядокзадается либо естественным следованием элементов, либо объектом, реализующиминтерфейс сравнения Comparator.
Этот классудобен при поиске элемента во множестве, например, для проверки, обладает ликакой-либо элемент свойством, определяющим множество.
В классе TreeSet четыре конструктора:
TreeSet() — создает пустой объект сестественным порядком элементов;
TreeSet(Comparator с) — создаетпустой объект, в котором порядок задается объектом сравнения с;
TreeSet(Collection coll) —создает объект, содержащий все элементы коллекции coll, с естественным порядком ее элементов;
TreeSet(SortedMap sf) — создаетобъект, содержащий все элементы отображения sf, втом же порядке. />Действия сколлекциями
Коллекциипредназначены для хранения элементов в удобном для дальнейшей обработки виде.Очень часто обработка заключается в сортировке элементов и поиске нужногоэлемента. Эти и другие методы обработки собраны в класс Collections.
/>Методы класса Collections
Все методыкласса Collections статические, ими можно пользоваться,не создавая экземпляры классу Collections
Как обычно встатических методах, коллекция, с которой работает метод, задается егоаргументом.
Сортировкаможет быть сделана только в упорядочиваемой коллекции, реализующей интерфейс List. Для сортировки в классе Collections есть два метода:
static voidsort (List coll) —сортирует в естественном порядке возрастания коллекцию coll, реализующую интерфейс List;
staticvoid sort (List coll, Comparator c) — сортируетколлекциюcoll
в порядке,заданном объектом с. После сортировки можно осуществить бинарный поиск вколлекции:
static intbinarySearch(List coll, Object element) — отыскивает элементelement в отсортированной в естественном порядке возрастанияколлекции coll и возвращает индекс элемента илиотрицательное число, если элемент не найден; отрицательное число показываетиндекс, с которым элемент element был бывставлен в коллекцию, с обратным знаком;
static intbinarySearchfList coll, Object element, Comparator c) — то же, но коллекция отсортированав порядке, определенном объектом с.
Четыре методанаходят наибольший и наименьший элементы в упорядочиваемой коллекции:
static Objectmax (Collection coll) —возвращает наибольший в естественном порядке элемент коллекции coll;
static Object max (Collection coll, Comparator c) — тоже в порядке,заданном объектом с;
static Objectmin (Collection coll) — возвращает наименьший вестественном порядке элемент коллекции coll;
staticObject min(Collection coll, Comparator c) — то же в порядке, заданном объектом с.
Два метода«перемешивают» элементы коллекции в случайном порядке:
static voidshuffle (List coll) —случайные числа задаются по умолчанию;
static voidshuffle (List coll, Random r) — случайные числа определяются объектом r.
Метод reverse (List coll) меняет порядок расположенияэлементов на обратный.
Метод copy (List from, List to) копирует коллекцию from в коллекцию to.
Метод fill (List coll, Object element) заменяет все элементы существующейколлекции coll элементом element.
/>
Приложение 4. Работа с датами ивременем
 
Работа сдатами и временем
Методы работыс датами и показаниями времени собраны в два класса: Calendar и Date из пакета java.util.
Объект классаDate хранит число миллисекунд, прошедшихс 1 января 1970 г. 00:00:00 по Гринвичу. Это «день рождения» UNIX, онназывается «Epoch».
Класс Dateудобно использовать для отсчета промежутков времени в миллисекундах.
Получитьтекущее число миллисекунд, прошедших с момента Epoch на той машине, где выполняется программа, можно статическим методом
System.currentTimeMillis()
В классе Date два конструктора. Конструктор Date() заносит в создаваемый объект текущее время машины, накоторой выполняется программа, по системным часам, а конструктор Date(long millisec)— указанное число.
Получить значение,хранящееся в объекте, можно методом long getTime(),
установитьновое значение — методомsetTime(longnewTime).
Трилогических метода сравнивают отсчеты времени:
boolean after(long when) — возвращаетtrue, если времяwhen больше данного;
booleanbefore (long when) —возвращает true, если время when меньше данного;
boolean after(Object when) —возвращает true, если времена when — объекта класca Date иданное совпадают.
Еще дваметода, сравнивая отсчеты времени, возвращают отрицательное число типа int, если данное время меньше аргумента when; нуль, есливремена совпадают; положительное число, если данное время больше аргумента when:
intcompareTo(Date when);
intcompareTo(Оbject when) —если when не относится к объектам класса Date, создается исключительная ситуация.
Преобразованиемиллисекунд, хранящихся в объектах класса Date,в текущее время и дату производится методами класса Calendar.
КлассCalendar
Класс Calendar — абстрактный, в нем собраны общиесвойства календарей: юлианского, григорианского, лунного. В Java API пока естьтолько одна его реализация — подкласс GregorianCalendar.
Поскольку Сalendar — абстрактный класс, его экземплярысоздаются четырьмя статическими методами по заданной локали и/или часовомупоясу:
Calendargetlnstance()
Calendargetlnstance(Locale loc)
Calendargetlnstance(TimeZone tz)
Calendargetlnstance(TimeZone tz, Locale loc)
Для работы смесяцами определены целочисленные константы от JANUARY
до DECEMBER, для работы с днями недели —константы MONDAY до SUNDAY.
Первый деньнедели можно узнать методом intgetFirstDayOfWeek(), a установить — методом setFirstDayOfWeek(int day), например:
setFirstDayOfWeek(Calendar.MONDAY)
Остальныеметоды позволяют просмотреть время и часовой пояс или установить их.
Представлениедаты и времени
Различныеспособы представления дат и показаний времени можно осуществить методами,собранными в абстрактный класс DateFormat и егоподкласс SimpleDateFormat из пакета Java. text.
Класс DateFormat предлагает четыре стиля представлениядаты и времени:
стиль SHORT представляет дату и время в коротком числовом виде:27.04.01 17:32; в локали США: 4/27/01 5:32 РМ;
стиль MEDIUM задает год четырьмя цифрами и показывает секунды:27.04.2001 17:32:45; в локали США месяц представляется тремя буквами;
стиль LONG представляет месяц словом и добавляет часовой пояс:27 апрель 2001 г. 17:32:45 GMT+03.-00;
стиль FULL в русской локали таков же, как и стиль LONG; в локали США добавляется еще день недели.
Есть ещестиль DEFAULT, совпадающий со стилем MEDIUM.
При созданииобъекта класса SimpieDateFormat можно задать в конструкторе шаблон,определяющий какой-либо другой формат, например:
SimpieDateFormatsdf = new SimpieDateFormat(«dd-MM-yyyy hh.mm»);System.out.println(sdf.format(new Date()));
Получим выводв таком виде: 27-07-2004 17.32. Приложение 5. Файловыйввод/вывод.
Посколькуфайлы в большинстве современных операционных систем понимаются какпоследовательность байтов, для файлового ввода/вывода создаются байтовые потокис помощью классов FileInputStream и FileOutputStream.Очень много файлов содержат тексты, составленные из символов. Несмотря на то,что символы могут храниться в кодировке Unicode, эти тексты чаще всего записаныв байтовых кодировках. Поэтому и для текстовых файлов можно использоватьбайтовые потоки. В таком случае со стороны программы придется организоватьпреобразование байтов в символы и обратно.
Чтобыоблегчить это преобразование, в пакет java.io введены классы FileReader и FileWriter. Они организуютпреобразование потока: со стороны программы потоки символьные, со стороны файла— байтовые. Это происходит потому, что данные классы расширяют классыInputStreamReader и OutputstreamWriter, соответственно, значит, содержат«переходное кольцо» внутри себя.
Несмотря наразличие потоков, использование классов файлового ввода/вывода очень похоже.
Вконструкторах всех четырех файловых потоков задается имя файла в виде строкитипа String или ссылка на объект классаFile. Конструкторы не только создают объект, но и отыскивают файл и открываютего. Например:
FileInputStreamfis = new FileInputStream(«C:\\PrWr.Java»);
FileReaderfr = new FileReader(«D:\\jdkl.3\\src\\PrWr.Java»);
При неудачевыбрасывается исключение класса FileNotFoundException, но конструктор классаFileWriter выбрасывает более общее исключение IOException.
Послеоткрытия выходного потока типа FileWriter или FileOutputStreamсодержимое файла, если он был не пуст, стирается. Для того чтобы можно былоделать запись в конец файла, и в том и в другом классе предусмотрен конструкторс двумя аргументами. Если второй аргумент равен true, то происходит дозапись вконец файла, если false, то файл заполняется новой информацией. Например:
FileWriterfw = new FileWriter(«c:\\8.txt», true);
FileOutputStreamfos = new FileOutputStream(«D:\\samples\\newfile.txt»);
Сразу послевыполнения конструктора можно читать файл:
fis.read();fr.read();
илизаписывать в него:
fos.write((char)с); fw.write((char)с);
По окончанииработы с файлом поток следует закрыть методом close().
Преобразованиепотоков в классах FileReader и FileWriter выполняется по кодовым таблицамустановленной на компьютере локали. Для правильного ввода кириллицы надоприменять FileReader, a нe FileInputStream. Если файл содержит текст в кодировке,отличной от локальной кодировки, то придется вставлять «переходноекольцо» вручную, как это может делаться для консоли, например:
InputStreamReaderisr = new InputStreamReader(fis, «KOI8_R»));
Байтовыйпоток fis определен выше.
Получениесвойств файла
Вконструкторах классов файлового ввода/вывода, описанных в предыдущем разделе,указывалось имя файла в виде строки. При этом оставалось неизвестным,существует ли файл, разрешен ли к, нему доступ, какова длина файла.
Получитьтакие сведения можно от предварительно созданного экземпляра класса File,содержащего сведения о файле. В конструкторе этого класса
File(Stringfilename)
указываетсяпуть к файлу или каталогу, записанный по правилам операционной системы.
Конструкторне проверяет, существует ли файл с таким именем, поэтому после создания объектаследует это проверить логическим методом exists().
Класс Fileсодержит около сорока методов, позволяющих узнать различные свойства файла иликаталога.
Прежде всего,логическими методами isFile(), isDirectory() можно выяснить, является ли путь, указанный в конструкторе,путем к файлу или каталогу.
Для каталогаможно получить его содержимое — список имен файлов и подкаталогов— методом list(), возвращающим массив строк String[].Можно получить такой же список в виде массива объектов класса File[] методом listFiles().
Если каталогс указанным в конструкторе путем не существует, его можно создать логическимметодом mkdir(). Этот метод возвращает true, есликаталог удалось создать. Логический метод mkdirs() создает еще и все несуществующие каталоги, указанные в пути.
Логическиеметоды canRead(), canwrite() показывают права доступа к файлу.
Файл можнопереименовать логическим методом renameTo(File newName) или удалить логическим методом delete(). Эти методы возвращают true, еслиоперация прошла удачно.
Если файл суказанным в конструкторе путем не существует, его можно создать логическимметодом createNewFile(), возвращающим true, если файл несуществовал, и его удалось создать, и false, если файл уже существовал.
Несколькометодов getxxx() возвращают имя файла, имя каталога идругие сведения о пути к файлу. Эти методы полезны в тех случаях, когда ссылкана объект класса File возвращается другими методами инужны сведения о файле. Наконец, метод toURL()возвращает путь к файлу в форме URL.
Буферизованный ввод/вывод
Операции ввода/вывода по сравнению с операциями в оперативной памятивыполняются очень медленно. Для компенсации в оперативной памяти выделяетсянекоторая промежуточная область — буфер, в которой постепенно накапливаетсяинформация. Когда буфер заполнен, его содержимое быстро переноситсяпроцессором, буфер очищается и снова заполняется информацией.
Классы файлового ввода/вывода не занимаются буферизацией. Для этой целиесть четыре специальных класса BufferedXxx. Они присоединяются к потокамввода/вывода как «переходное кольцо», например:
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(fw);
Потоки isr и fw определены выше.
Данная программа читает текстовый файл, написанный в кодировке СР866, изаписывает его содержимое в файл в кодировке Cp1251. При чтении и записи применяется буферизация.
import java.io.*;
class DOStoWindows{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream d:\\dos.txt, «Cp866»));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream d:\\windows.txt, «Cp1251»));
int с = 0;
while ((c = br.read()) != -1) bw.write((char)c);
br.close(); bw.close();
System.out.println(«Все OK.»);
}
}

/>Приложение 6. Обработка исключений
Исключительныеситуации (exceptions)могут возникнуть во время выполнения (runtime) программы, прервав ее обычныйход. К ним относится деление на нуль, отсутствие загружаемого файла,отрицательный или вышедший за верхний предел индекс массива, переполнениевыделенной памяти и масса других неприятностей, которые могут случиться в самыйнеподходящий момент.
Вобъектно-ориентированных языках программирования принят такой подход. Привозникновении исключительной ситуации исполняющая система создает объектопределенного класса, соответствующего возникшей ситуации, содержащий сведенияо том, что, где и когда произошло. Этот объект передается на обработкупрограмме, в которой возникло исключение. Если программа не обрабатываетисключение, то объект возвращается обработчику по умолчанию исполняющейсистемы. Обработчик поступает очень просто: выводит на консоль сообщение опроизошедшем исключении и прекращает выполнение приложения.Блокиперехвата исключения
Мы можем перехватить иобработать исключение в программе. При описании обработки применяетсябейсбольная терминология. Говорят, что исполняющая система или программа«выбрасывает» (throws) объект-исключение. Этот объект«пролетает» через всю программу, появившись сначала в том методе, гдепроизошло исключение, а программа в одном или нескольких местах пытается (try)его «перехватить» (catch) и обработать. Обработку можно сделатьполностью в одном месте, а можно обработать исключение в одном месте, выброситьснова, перехватить в другом месте и обрабатывать дальше.
Для того чтобы попытаться(try) перехватить (catch) объект-исключение, надо весь код программы, в которомможет возникнуть исключительная ситуация, охватить оператором try{} catch() {}.Каждый блок catch(){} перехватывает исключение только одного типа, того,который указан в его аргументе. Но можно написать несколько блоков catch(){}для перехвата нескольких типов исключений.
После блоков перехватаможет быть вставлен еще один, необязательный блок finally(). Он предназначен для выполнения действий, которые надовыполнить обязательно, чтобы ни случилось. Все, что написано в этом блоке,будет выполнено и при возникновении исключения, и при обычном ходе программы, идаже если выход из блока try{} осуществляется оператором return.
Если в оператореобработки исключений есть блок finally{}, то блок catch () {} можетотсутствовать, т. е. можно не перехватывать исключение, но при еговозникновении все-таки проделать какие-то обязательные действия. Пустой блокcatch (){}, в котором между фигурными скобками нет ничего, даже пробела, тожесчитается обработкой исключения и приводит к тому, что выполнение программы непрекратится. Частьзаголовка метода throws
То обстоятельство, чтометод не обрабатывает возникающее в нем исключение, а выбрасывает (throws) его,следует отмечать в заголовке метода служебным словом throws и указанием классаисключения:
private staticvoid f(int n) throws ArithmeticException{
System.out.println("10 / n = " + (10 / n));
}
Исключение ArithmeticException выпадает, например, при делении наноль.
Дело в том, чтоспецификация JLS делит все исключения на проверяемые (checked), те, которыепроверяет компилятор, и непроверяемые (unchecked). При проверке компиляторзамечает необработанные в методах и конструкторах исключения и считает ошибкойотсутствие в заголовке таких методов и конструкторов пометки throws. Именно дляпредотвращения подобных ошибок вставляются в листинги блоки обработкиисключений.
Так вот, исключениякласса RuntimeException и его подклассов, одним из которых являетсяArithmeticException, непроверяемые, для них пометка throws необязательна. Ещеодно большое семейство непроверяемых исключений составляет класс Error и егорасширения.
Почему компилятор непроверяет эти типы исключений? Причина в том, что исключения классаRuntimeException свидетельствуют об ошибках в программе, и единственно разумныйметод их обработки — исправить исходный текст программы и перекомпилировать ее.Что касается класса Error, то эти исключения очень трудно локализовать и настадии компиляции невозможно определить место их появления.
Напротив, возникновениепроверяемого исключения показывает, что программа недостаточно продумана, невсе возможные ситуации описаны. Такая программа должна быть доработана, о чем инапоминает компилятор.
Если метод иликонструктор выбрасывает несколько исключений, то их надо перечислить череззапятую после слова throws. Операторthrow
Этот оператор оченьпрост: после слова throw через пробел записывается объект класса-исключения.Достаточно часто он создается прямо в операторе throw, например:
throw newArithmeticException();
Оператор можно записать влюбом месте программы. Он немедленно выбрасывает записанный в немобъект-исключение и дальше обработка этого исключения идет как обычно, будто быздесь произошло деление на нуль или другое действие, вызвавшее исключениекласса ArithmeticException.
Итак, каждый блок catch()и перехватывает один определенный тип исключений. Если требуется одинаковообработать несколько типов исключений, то можно воспользоваться тем, что классы-исключенияобразуют иерархию. Таким образом, перемещаясь по иерархии классов-исключений,мы можем обрабатывать сразу более или менее крупные совокупности исключений.Рассмотрим подробнее иерархию классов-исключений. Иерархияклассов-исключений
Все классы-исключениярасширяют класс Throwable —непосредственное расширение класса Object.
У класса Throwable и у всех его расширений по традициидва конструктора:
·      Throwable () — конструктор по умолчанию;
·      Throwable (String message) — создаваемыйобъект будет содержать произвольное сообщение message.
Записанное в конструкторесообщение можно получить затем методом getMessage (). Если объект создавалсяконструктором по умолчанию, то данный метод возвратит null.
Метод toString() возвращает краткое описаниесобытия.
Три метода выводятсообщения обо всех методах, встретившихся по пути «полета»исключения:
·      printstackTrace()— выводит сообщения в стандартный вывод, как правило, это консоль;
·      printStackTrace(PrintStreamstream) — выводит сообщения в байтовый поток stream;
·      printStackTrace(PrintWriterstream) — выводит сообщения в символьный поток stream.
У класса Throwable два непосредственных наследника —классы Error и Exception. Они не добавляют новых методов, а служат дляразделения классов-исключений на два больших семейства — семействоклассов-ошибок (error) и семейство собственно классов-исключений (exception).
Классы-ошибки,расширяющие класс Error, свидетельствуют о возникновении сложных ситуаций ввиртуальной машине Java. Их обработка требует глубокого понимания всехтонкостей работы JVM. Ее не рекомендуется выполнять в обычной программе. Несоветуют даже выбрасывать ошибки оператором throw. He следует делать своиклассы-исключения расширениями класса Error или какого-то его подкласса.
Имена классов-ошибок, посоглашению, заканчиваются словом Error.
Классы-исключения,расширяющие класс Exception, отмечают возникновение обычной нештатной ситуации,которую можно и даже нужно обработать. Такие исключения следует выброситьоператором throw. Классов-исключений очень много, более двухсот. Они разбросаныбуквально по всем пакетам J2SDK. В большинстве случаев вы способны подобратьготовый класс-исключение для обработки исключительных ситуаций в своейпрограмме. При желании можно создать и свой класс-исключение, расширив классException или любой его подкласс.
Среди классов-исключенийвыделяется класс RuntimeException — прямое расширение класса Exception. В нем иего подклассах отмечаются исключения, возникшие при работе JVM, но не стольсерьезные, как ошибки. Их можно обрабатывать и выбрасывать, расширять своимиклассами, но лучше доверить это JVM, поскольку чаще всего это просто ошибка впрограмме, которую надо исправить. Особенность исключений данного класса в том,что их не надо отмечать в заголовке метода пометкой throws.
Имена классов-исключений,по соглашению, заканчиваются словом Exception. Порядокобработки исключений
Блоки catch () {}перехватывают исключения в порядке написания этих блоков. Это правило приводитк интересным результатам.
try{
// Операторы, вызывающиеисключения
}catch(Exception e){
// Какая-то обработка
}catch(RuntimeException re){
// Никогда не будетвыполнен!
}
Второй блок не будетвыполняться, поскольку исключение типа RuntimeException является исключениемобщего типа Exception и будет перехватываться предыдущим блоком catch () {}.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.