47707 (Наследование и классы-коллекции)
Описание файла
Документ из архива "Наследование и классы-коллекции", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "47707"
Текст из документа "47707"
Факультет "Информатика и системы управления"
Методические указания к лабораторной работе
по курсу "Распределенные системы обработки информации"
Наследование и классы-коллекции
Москва 2004 г.
Оглавление
Цель работы 3
Задание для домашней подготовки 3
Задания к лабораторной работе 3
Задание 1 3
Задание 2 4
Содержание отчета 4
Контрольные вопросы. 4
Литература. 6
Приложение 1. Спецификация класса Statistics. 7
Приложение 2. Работа со строками. 9
Приложение 3. Классы – коллекции. 20
Приложение 4. Работа с датами и временем. 41
Приложение 5. Файловый ввод/вывод. 43
Приложение 6. Обработка исключений. 48
Цель работы
-
Научиться работать с коллекциями и классами, реализующими интерфейс Collection.
-
Познакомиться с основными классами пакета java.util.
-
Освоить работу с системным временем (Класс java.util.Date).
-
Научиться работать с файлами и потоками ввода/вывода.
-
Научиться обрабатывать строки (объекты класса String).
-
Применить полученные знания на практике
Задание для домашней подготовки
-
Ознакомиться с материалом, предоставленным в приложениях к данным методическим указаниям.
-
Изучить примеры программ, реализующих файловый ввод/вывод (см. Приложение 5).
-
Ознакомиться с текстом задания к лабораторной работе в соответствии с вариантом и написать программу.
Задания к лабораторной работе
Задание 1
2 варианта:
-
Написать программу, которая считывает текст из входного файла, подсчитывает, сколько раз встретился каждый символ русского алфавита, и выводит результат в выходной файл, например, в виде строк “ символ - число”.
-
Написать программу, которая считывает текст из входного файла, формирует множество слов и выводит результат в выходной файл. Одинаковые слова, встретившиеся в тексте, нужно вывести в третий файл в виде строк “слово - число”.
Для обоих вариантов:
-
Классы – коллекции, с помощью которых будет выполнена обработка текста, студент выбирает самостоятельно.
Задание 2
Строки и файлы [Л.2 на с.107-109]. Номер задания соответствует порядковому номеру в журнале (по модулю 20).
Содержание отчета
Отчет должен содержать:
-
Постановку задачи, решаемой отлаженной программой.
-
Руководство пользователя отлаженной программы, содержащее описание интерфейсов всех функций программы.
-
Листинг программы с необходимыми комментариями.
Контрольные вопросы
-
Как изменить кодировку символов (“KOI8_R”, “Cp866”, …) в потоках ввода/вывода?
-
Как сделать программу нечувствительной к регистру символов входного файла?
-
Как изменить программу, чтобы имена входных/выходных файлов нужно было бы вводить с клавиатуры или задавать в командной строке.
-
Как нужно изменить программу, чтобы после объявления метода public static void main(String[] args) не нужно было бы записывать throws IOException.
-
Как известно, время в приложения Java записывается в виде целочисленных значений типа long, выраженных в миллисекундах и отсчитываемых с полуночи (00:00:00 GMT) 1 января 1970 года. На сколько лет хватит размера (8байт) значения типа long для отсчета миллисекунд?
-
Как можно изменить программу, чтобы подсчитать время обработки файлов без использования класса Date, введя одну дополнительную переменную.
-
Как сравнить две строки.
-
Как выбрать i-ый символ строки.
Литература
-
Арнолд К., Гослинг Дж., Холмс Д. Язык программирования Java:Пер. с англ. – М.: Издательский дом «Вильямс», 2001 г. – 624 с., ил.
-
Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. -СПб.: Питер, 2002. -240с.
Дополнительная
-
Официальный сайт Java — http://java.sun.com/ (есть раздел на русском языке с учебником).
-
Java™ 2 SDK, Standard Edition Documentation — http://java.sun.com/products/jdk/1.5/index.html.
-
Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification — http://www.javasoft.com/docs/books/jls/). Перевод на русский язык — http://www.uni-vologda.ac.ru/java/jls/index.html
-
Официальный сайт проекта Eclipse — http://www.eclipse.org/.
А также
-
Дмитрий Рамодин. Начинаем программировать на языке Java.
-
Николай Смирнов. Java 2: Учебное пособие.
-
Картузов А. В. Программирование на языке Java.
-
Вязовик Н.А. Программирование на Java.
Приложение 1. Спецификация класса Statistics.
import java.io.*;//подключение пакета с классами ввода/вывода
import java.util.*; //подключение пакета с классами коллекций и времени
public class Statistics {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d:\\input.txt"));
//Входной поток — из файла d:\input.txt
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("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 = "Это длинная строка, " +
"записанная в двух строках исходного текста";
Не забывайте разницу между пустой строкой String s = "", не содержащей ни одного символа, и пустой ссылкой String s = null, не указывающей ни на какую строку и не являющейся объектом.
Самый правильный способ создать объект с точки зрения ООП — это вызвать его конструктор в операции new. Класс String предоставляет девять конструкторов:
-
String() — создается объект с пустой строкой;
-
String(String str) — из одного объекта создается другой, поэтому этот конструктор используется редко;
-
String(StringBuffer str) — преобразованная копия объекта класса 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 — строку "вольный".
Сцепление строк
Со строками можно производить операцию сцепления строк, обозначаемую знаком плюс +. Эта операция создает новую строку, просто составленную из состыкованных первой и второй строк. Ее можно применять и к константам, и к переменным. Например:
String attention = "Внимание: ";
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(int ind) Если индекс 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 включительно до конца строки.