Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Приложение 2. Работа со строками

Оглавление

 

Цель работы.. 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 — http://java.sun.com/ (есть раздел на русском языке с учебником).

2. Java™ 2 SDK, Standard Edition Documentation — http://java.sun.com/products/jdk/1.5/index.html.

3. Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification — http://www.javasoft.com/docs/books/jls/). Перевод на русский язык — http://www.uni-vologda.ac.ru/java/jls/index.html

4. Официальный сайт проекта Eclipse — http://www.eclipse.org/.

 

А также

5. Дмитрий Рамодин. Начинаем программировать на языке Java.

6. Николай Смирнов. Java 2: Учебное пособие.

7. Картузов А. В. Программирование на языке Java.

8. Вязовик Н.А. Программирование на 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 включительно до конца строки.

Если индексы отрицательны, индекс 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(String str).

Эти методы не учитывают алфавитное расположение символов в локальной кодировке.

Русские буквы расположены в Unicode по алфавиту, за исключением одной буквы. Заглавная буква Ё расположена перед всеми кириллическими буквами, ее код '\u040l', а строчная буква е — после всех русских букв, ее код '\u0451'.

Кодировки русских букв:

‘А’ ~ 1040 ~ \u410

‘Я’~ 1071 ~ \u42F

‘а’ ~ 1072 ~ \u430

‘я’ ~ 1103 ~ \u44F

Как найти символ в строке

Поиск всегда ведется с учетом регистра букв.

Первое появление символа ch в данной строке this можно отследить методом indexOf(int ch), возвращающим индекс этого символа в строке или -1, если символа ch в строке this нет.

Например, "Молоко", indexOf('о') выдаст в результате 1.

Второе и следующие появления символа ch в данной строке this можно отследить методом indexOf(int ch, int ind).

Этот метод начинает поиск символа ch с индекса ind. Если ind < 0, то поиск идет с начала строки, если ind больше длины строки, то символ не ищется, т. е. возвращается -1.

Последнее появление символа ch в данной строке this отслеживает метод lastIndexof (int ch). Он просматривает строку в обратном порядке. Если символ ch не найден, возвращается.-1.

Предпоследнее и предыдущие появления символа ch в данной строке this можно отследить методом lastIndexof(int ch, int ind), который просматривает строку в обратном порядке, начиная с индекса ind.

Если ind больше длины строки, то поиск идёт от конца строки, если ind < 0, то возвращается -1.

Как найти подстроку

Поиск всегда ведется с учетом регистра букв.

Первое вхождение подстроки sub в данную строку this отыскивает метод indexof (String sub). Он возвращает индекс первого символа первого вхождения подстроки sub в строку или -1, если подстрока sub не входит в строку this.

Если вы хотите начать поиск не с начала строки, а с какого-то индекса ind, используйте метод indexOf (String sub, int ind). если ind < 0, то поиск идет с начала строки, если ind больше.длины строки, то символ не ищется, т. е. возвращается -1.

Последнее вхождение подстроки sub в данную строку this можно отыскать методом lastindexof (string sub), возвращающим индекс первого символа последнего вхождения подстроки sub в строку this или (-1), если подстрока sub не входит в строку this.

Последнее вхождение подстроки sub не во всю строку this, а только в ее начало до индекса ind можно отыскать методом lastIndexof(String stf, int ind). Если ind больше длины строки, то поиск идет от конца строки, если ind < 0, то возвращается -1.

Перечисленные выше методы создают исключительную ситуацию, если

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, int len) преобразует в строку подмассив массива ch, начинающийся с индекса offset и имеющий len элементов.

Кроме того, в каждом классе есть метод toString (), переопределенный или просто унаследованный от класса Object. Он преобразует объекты класса в строку. Фактически, метод valueOf() вызывает метод toString() соответствующего класса. Поэтому результат преобразования зависит от того, как реализован метод toString().

Еще один простой способ — сцепить значение elem какого-либо типа с пустой строкой: "" + elem. При этом неявно вызывается метод elem.toString ().

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...