МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Робота з рядками в Java
Методичні вказівки
до виконання лабораторної роботи №4
з курсу “Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
ЗАТВЕРДЖЕНО
на засіданні кафедри “Системи автоматизованого проектування” Протокол № 1від 30.08.2010
ЛЬВІВ 2010 Мова програмування Java. Методичні вказівки до виконання лабораторної роботи №4 “Робота з рядками в Java” з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі: Каркульовський В.І., доцент, к.т.н.
Керницький А.Б., ст.викл., др.інж.
Відповідальний за випуск:
Рецензенти:
1. МЕТА РОБОТИ
Отримати навички програмування з використанням стрічок у мові Java.
2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Важливе місце в обробці інформації займає робота з текстами. Текстові рядки у мові Java є об’єктами. Вони представляються екземплярами класу String або класу StringBuffer. Звичайно, можна занести текст у масив символів типу char або навіть у масив байтів типу byte, але тоді не буде можливості використати готові методи роботи з текстовими рядками.
Для чого в мову введені два класи для зберігання рядків? В об’єктах класу String зберігаються рядки-константи незмінної довжини і змісту. Це значно прискорює оброблення рядків і дозволяє економити пам’ять, розділяючи рядок між об’єктами, які його використовують. Довжину рядків, які зберігаються в об’єктах класу StringBuffer, можна змінювати, вставляючи і додаючи рядки і символи, видаляючи підрядки або з’єднуючи декілька рядків в один. У багатьох випадках, коли потрібно змінити довжину рядка типу String , компілятор Java неявно перетворює його в тип StringBuffer, змінює довжину, потім перетворює назад у тип String. Наприклад, наступна дія
String s = "Це" + " один " + "рядок";
компілятор виконує наступним чином:
String s = new StringBuffer().append("Це").append(" один ").append("рядок").toString();
Створюється об’єкт класу StringBuffer, у нього послідовно додаються рядки "Це", " один ", "рядок", і одержаний об’єкт класу StringBuffer буде приведений до типу String методом toString (). Нагадаємо, що символи у рядках зберігаються у кодуванні Unicode, в якому кожний символ займає два байти. Тип кожного символу - char.
2.1. КЛАС String
Перед роботою з рядком його потрібно створити. Це можна зробити різними способами.
2.1.1. Створення рядка
Найпростіший спосіб створити рядок — це організувати посилання типу String на рядок-константу:
String s1= "Це рядок.";
Якщо константа довга, то її можна записати у декількох рядках текстового редактора, зв’язуюючи їх операцією зчеплення:
String s2 = "Це довгий рядок, " + "записаний в двох рядках вихідного тексту";
Не потрібно забувати різницю між порожнім рядком String s = "", який не містить жодного символу, і порожнім посиланням String s = null, яке не вказує на жодний рядок і не є об’єктом.
Найправильніший спосіб створення об’єкту з точки зору ООП — це викликати його конструктор в операції new. Клас String надає у розпорядження дев’ять конструкторів:
String() — створюється об’єкт з порожнім рядком;
String (String str) — з одного об’єкта створюється інший, тому даний конструктор рідко використовується;
String (StringBuffer str) — перетворена копія об’єкту класу BufferString;
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 виникає виключна ситуація.
Конструктори, які використовують масив байтів byteArray, призначені для створення Unicode-рядка із масиву байтових ASCII-кодувань символів. Така ситуація виникає при читанні ASCII-файлів, одержанні інформації із бази даних або при передачі інформації по мережі. У найпростішому випадку компілятор для отримння двобайтових символів Unicode додасть до кожного байту старший нульовий байт. Отримається діапазон ' \u0000 ' — ' \u00ff ' кодування Unicode, який відповідає кодам Latin 1. Тексти на кирилиці будуть виведені неправильно.
Якщо ж на комп’ютері всановлені локальні налаштування, (за допомогою утиліти Regional Options у вікні Control Panel), тоді компілятор, прочитавши ці налаштування, створить символи Unicode, що відповідають місцевому кодуванню сторінки. В кирилізованому варіанті MS Windows, яким у більшості випадків користуються, це — кодова сторінка СР1251.
Якщо вихідний масив с кириличним ASCII-текстом був у кодуванні СР1251, тоді рядок Java буде створений правильно. Кирилиця попаде у свій діапазон '\u0400'—'\u04FF' кодування Unicode. Інші кириличні кодування не розглядаються у даній лабораторній роботі. Якщо вихідний кириличний ASCII-текст був в одному із цих кодувань, а локальне кодування СР1251, тоді Unicode-символи рядка Java не будуть відповідати кирилиці. У таких випадках використовуються два останні конструктори, в яких параметром encoding вказується, яку кодову таблицю використовувати конструктору при створенні рядка.
Ще один спосіб створення рядка — це використання двох статичних методів
copyValueOf(chart] charArray) і copyValueOf(char[] charArray, int offset, int length).
Вони створюють рядок по заданому масиву символів і повертають його в якості результату своєї роботи. Наприклад, після виконання наступного фрагменту програми
char[] с = ('С', 'и', 'м', 'в', 'о', 'л', 'ь', 'н', 'и', 'й'};
String s1 = String.copyValueOf(с);
String s2 = String.copyValueOf(с, 3, 7);
одержимо в об’єкті s1 рядок "Символьний", а в обєкті s2 - рядок "вольний".
2.1.2. Зчеплення рядків
З рядками можна здійснювати операцію зчеплення рядків (concatenation), що позначається знаком плюс +. Ця операція створює новий рядок, який складається із першого і другого рядка. Її можна застосувати і до констант, і до змінних. Наприклад:
String attention = "Увага: ";
String s = attention + "невідомий символ";
Друга операція - присвоювання += застосовується до змінних у лівій частині:
attention += s;
Оскільки операція + перевантажена з додавання чисел на зчеплення рядків, то постає питання про пріоритет цих операцій. У зчеплення рядків пріоритет є вищим, ніж у додаванні, тому, записавши "2" + 2 + 2, одержимо рядок "222". Але, записавши 2 + 2 + "2", одержимо рядок "42", оскільки дії виконуються зліва направо. Якщо ж запишемо "2" + (2 + 2), то одержимо "24".
5.1.3. Маніпуляції рядками
У класі String присутні багато методів для роботи з рядками.
Для того щоб взнати довжину рядка, тобто кількість символів в ньому, потрібно викорисати метод length():
String s = "Write once, run anywhere.";
int len = s.length();
або
int len = "Write once, run anywhere.".length();
оскільки рядок-константа — повноцінний об’єкт класу String. Зауважте, що рядок — це не масив і у нього немає поля length (символи зберігаються у масиві, але він закритий, як і всі поля класу String).
Вибрати символ з індексом ind (індекс першого символу дорівнює нулю) можна за допомогою методу charAt(int ind). Якщо індекс ind від’ємний або не менший за довжину рядка, тоді виникає виключна ситуація. Наприклад, після визначення
char ch = s.charAt(3);
змінна ch буде мати значення 't'
Всі символи рядка у вигляді масиву символів можна отримати методом за допомогою методу
toCharArray(), що повертє масив символів.
Якщо ж потрібно включити у масив символів dst, починаючи з індексу ind масиву підрядок від індексу begin включно до індексу end, тоді потріно скористатися методом getChars(int begin, int end, char[] dst, int ind) типу void. У масив буде записано end - begin символів, які займуть елементи масиву, починаючи з індексу ind до індексу ind + (end - begin) - 1. Цей метод створює виключну ситуацію у наступних випадках:
посилання dst = null;
індекс begin від’ємний;
індекс begin більший за індекс end;
індекс end більший довжини рядка;
індекс ind від’ємний;
ind + (end - begin) > dst.length.
Лістинг 2.1.
public class getChar{
public static void main(String[] args){
String str = "How are you.";
char[] arr = new char[7];
str.getChars(2, 9, arr, 0);
System.out.print("The Character array equals: ");
System.out.println(arr);
}
}
результат буде наступним:
C:\unique>javac getChar.java
C:\unique>java getChar
The Character array equals: w are y
C:\unique>
Якщо потрібно одержати масив байтів, що містить всі символи рядка у байтовому кодуванні 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 одержуємо лише у випадку, коли обидва посилання вказують на один і той самий рядок, наприклад, після присвоєння s1 = s2.
Логічний метод equals (object obj), перевизначений із класу Оbject, повертає true, якщо аргумент obj не дорівнює null, є об’єктом класу String, і рядок, що міститься у ньому, є повністю ідентичний даному рядку аж до співпадіння регістру літер. У решті випадків повертається значення false.
Логічний метод equalsIgnoreCase(object obj) працює так само, але однакові літери, записані у різних регістрах, вважаються співпадаючими.
Наприклад, s2.equals("інший рядок") дасть у результаті false, а s2.equalsIgnoreCase("інший рядок") поверне true.
Метод compareTo(string str) повертає ціле число типу int, обчислене за наступними правилами:
Порівнюються символи даного рядка this і рядка str з однаковими індексами, доки не зустрінуться різні символи з індексом k, або доки один з рядків не закінчиться.
У першому випадку повертається значення this.charAt(k) - str.charAt(k), тобто різниця кодів Unicode перших неспівпадаючих символів.
У другому випадку повертається значення this.length() - str.length(), тобто різниця довжин рядків.
Якщо рядки співпадають, повертається 0.
Якщо значення str дорівнює null, виникає виключна ситуація. Нуль повертається у тій самій ситуації, в якій метод equals() повертає true.
Метод compareToІgnoreCase(string str) робить порівняння без врахування регістру літер.
Ще один метод - compareTo(Object obj) створює виключну ситуацію, якщо obj не є рядком. У решті випадків він працює як метод compareTo(String str). Ці методи не враховують алфавітний порядок символів в локальнму кодуванні.
Порівняти підрядок даного рядка this з підрядком тієї ж довжини len іншого рядка str можна логічним методом:
regionMatches(int indl, String str, int ind2, int len)
Тут ind1 — індекс початку підрядка даного рядка this, ind2 - індекс початку підрядка іншого рядка str. Результат false отримаємо у наступних випадках:
хоча б один із індексів ind1 або ind2 є від’ємний;
хоча б один із ind1 + len або ind2 + len є більшим довжини відповідного рядка;
хоча б одна пара символів не співпадає.
Цей метод розрізняє символи, записані у різних регістрах. Якщо потрібно порівняти підрядки без врахування регістрів літер, тоді використовується логічний метод:
regionMatches(boolean flag, int indl, String str, int ind2, int len)
Якщо перший параметр flag дорівнює true, тоді регістр літер при порівнянні підрядків не враховується, якщо ж false - тоді враховується.
Пошук завжди ведеться із врахуванням регістру літер. Першу появу символу ch у даному рядку this можна виявити методом indexOf(int ch), що повертає індекс цього символу у рядку або -1, якщо символу ch у рядку this немає.
Наприклад, "Україна". indexOf('ї') видасть у результаті 1.
Другу і наступні появи символу ch у даному рядку this можна відслідкувати методом indexOf(int ch, int ind). Цей метод починає пошук символу ch з індекса ind. Якщо ind < 0, тоді пошук іде від початку рядка, якщо ind більше за довжину рядка, тоді символ не шукається, тобто повертається -1.
Наприклад, "Україна".indexof('а', indexof ('а') + 1) дасть в результаті 2.
Остання поява символу ch у даному рядку this відслідковується методом lastIndexОf (int ch). Він переглядає рядок у зворотному порядку. Якщо символ ch не знайдено, тоді повертається -1.
Наприклад, "Україна".lastІndexОf('а') дасть в результаті 6.
Передостанню і попередню появу символу ch у даному рядку this можна відслідкувати методом lastIndexОf(int ch, int ind), якийй переглядає рядок у зворотному порядку, починаючи з індексу ind. Якщо ind більше за довжину рядка, тоді пошук іде від кінця рядка, якщо ind < 0, тоді повертається -1.
Останнє входження підрядка sub у даний рядок this можна відшукати методом lastІndexОf (string sub), що повертає індекс першого символу останнього входження підрядка sub у рядок this або -1, якщо підрядок sub не входить у рядок this.
Останнє вхоження підрядка sub не у весь рядок this, а тільки в його початок до індексу ind можна відшукати методом lastIndexof(String stf, int ind). Якщо ind є більшим за довжину рядка, тоді пошук іде від кінця рядка, якщо ind < 0, то повертається -1.
Для того щоб перевірити, чи не починається даний рядок this з підрядка sub, потрібно використовувати логічний метод startsWith(string sub), який повертає true, якщо даний рядок this починається з підрядка sub, або співпадає з ним, або підрядок sub пустий.
Можна перевірити і появу підрядка sub у даному рядку this, починаючи з деякого індексу ind логічним методом startsWith(String sub),int ind). Якщо індекс ind від’ємний або більший за довжину рядка, тоді повертається false.
Для того щоб перевірити, чи не закінчується даний рядок this підрядком sub, треба використовувати логічний метод endsWitht(String sub). Цей метод повертає true, якщо підрядок sub співпадає з усім рядком або підрядок sub є порожнім.
Наприклад, if (fileName.endsWith(". Java")) відслідкує імена файлів з вихідними текстами Java.
Перераховані вище методи створюють виключну ситуацію, якщо
sub == null.
Якщо потрібно здійснити пошук, який не враховує регістри літер, тоді потрібно поміняти перед цим регістр всіх символів рядка.
Метод toLowerCase () повертає новий рядок, у якому всі літери переведені у нижній регістр.
Метод toUpperCase () повертає новий рядок, у якому всі літери переведені у верхній регістр. При цьому використовується локальна таблиця кодування по замовчуванню. Якщо потрібна інша локалізація, тоді застосовуються методи toLowerCase(Locale loc) і toUpperCase(Locale loc).
Метод replace (int old, int new) повертає новий рядок, у якому всі входження символу old замінені символом new. Якщо символа old у рядку немає, тоді повертається посилка на вихідний рядок. Регістр літер при заміні враховується.
Метод trim() повертає новий рядок, в якому видалені початкові і кінцеві пробіли.
У мові Java прийнято, що кожний клас відповідає за перетворення інших типів у тип цього класу і повинен містить потрібні для цього методи. Клас String містить вісім статичних методів valueОf (type elem) для перетворення у рядок примітивних типів boolean, char, int, long, float, double, масиву char[], і просто об’єкту типу Оbject. Дев’ятий метод valueОf(char[] ch, int offset, int len) перетворює в рядок підмасив масиву ch, який починається з індексу offset і має len елементів.
Крім того, у кожному класі присутній метод toString (), перевизначений або просто унаслідуваний від класу Object. Він перетворює об’єкти класу в рядок. Фактично, метод valueOf() викликає метод toString () відповідного класу. Тому результат перетворення залежить від того, як реалізовано метод toString ().
Ще один простий спосіб зчепити значення elem якогось типу з порожнім рядком: "" + elem. При цьому неявно викликається метод elem. toString ().
2.2. КЛАС StringBuffer
Об’єкти класу StringBuffer - це рядки змінної довжини. Щойно створений об’єкт має буфер визначеної ємності (capacity), він за замовчуванням достатній для зберігання 16 символів. Ємність можна задати в конструкторі об’єкта. Як тільки буфер починає переповнюватися, його ємність автоматично збільшується, щоб вмістити нові символи. Також ємність буферу можна збільшити, звернувшись до методу ensureCapacity(int minCapacity). Цей метод змінить ємність тільки якщо значення minCapacity буде більшим за довжину рядка, що зберігається в об’єкті. Ємність буде збільшена за наступним правилом: нехай ємність буфера дорівнює N. Тоді нова ємність буде дорівнювати: Мах(2 * N + 2, minCapacity)
Таким чином, ємність буфера не можна збільшити менше ніж удвічі.
Методом setLength(int newLength) можна встановити довільну довжину рядка. Якщо вона виявиться більшою за поточну довжину, тоді додаткові символи будуть рівні ' \u0000'. Якщо вона буде менша за поточну довжину, тоді рядок буде обрізаний, останні символи втратяться, точніше, будуть замінені символом '\u0000'. Ємність при цьому не зміниться. Якщо число newLength виявиться від’ємним, виникає виключна ситуація.
Треба бути обережним встановлюючи нову довжину об’єкту. Кількість символів у рядку можна взнати, як і для об’єкту класу String, методом length (), а ємність — методом capacity (). Створити об’єкт класу StringBuffer можна тільки конструкторами.
У класі StringBuffer є три конструктори:
stringBuffer () - створює порожній об’єкт з ємністю 16 символів;
stringBuffer.(int capacity) - створює порожній об’єкт заданої ємності capacity;
StringBuffer (String str) - створює об’єкт ємністю str.length() + 16, що містить рядок str.
У класі StringBuffer є десять методів append (), що додають підрядок у кінець рядка. Вони не створюють новий екземпляр рядка, а повертають посилання на той самий, але змінений рядок.
Основний метод append (string str) приєднує рядок str в кінець даного рядка. Якщо посилання str == null, тоді дододається рядок "null".
Шість методів append (type elem) додають примітивні типи boolean, char, int, long, float, double, перетворені у рядок.
Два методи приєднують до рядка масив str і підмасив sub символів, перетворені в рядок: append (char [] str) і append (char [.] , sub, int offset, int len).
Десятий метод додає просто об’єкт append (Object obj). Перед цим об’єкт obj перетворюється у рядок своїм методом toString ().
Десять методів insert () призначені для вставляння рядка, вказаного параметром методу, у даний рядок. Місце вставляння задається першим параметром методу ind. Це індекс елементу рядка, перед яким буде зроблене вставляння. Він повинен бути невід’ємним і менше довжини рядка, інакше виникне виключна ситуація. Рядок роззувається, ємність буферу при необхідності збільшується. Методи повертають посилання на той самий перетворений рядок.
Основний метод insert (int ind, string str) вставляє рядок str у даний рядок перед його символом з індексом іnd. Якщо посилання str == null, тоді вставляється рядок "null".
Наприклад, після виконання
String s = new StringBuffer("Це великий рядок"). insert(3, "не").toString();
одержимо s == "Це невеликий рядок".
Метод sb.insert(sb.length о, "xxx") буде працювати так само, як і метод
sb.append("xxx").
Шість методів insert (int ind, type elem) вставляють примітивні типи boolean, char, int, long, float, double, перетворені у рядок. Два методи вставляють масив str і підмасив sub символів, перетворені в рядок:
insert(int ind, chart] str)
insert(int ind, char[] sub, int offset, int len)
Десятий метод вставляє просто об’єкт:
insert(int ind, Object obj)
Об’єкт obj перед додаванням перетворюється у рядок своїм методом toString().
Метод delete(int begin, int end) видаляє із рядка символи, починаючи з індексу begin включно до індексу end, якщо end є більшим за довжину рядка, тоді до кінця рядка.
Наприклад, після виконання
String s = new StringBuffer("Це невеликий рядок").
delete(3, 5).toString();
одержимо s == "Це великий рядок".
Якщо begin є від’ємним, більшим за довжину рядка або більшим за end, тоді виникає виключна ситуація.
Якщо begin == end, видалення не відбувається.
Метод deІeteCharAt (int ind) видаляє символ із вказаним індексом ind. Довжина рядка зменшуєтся на одиницю. Якщо індекс ind від’ємний або більший за довжину рядка, тоді виникає виключна ситуація.
Метод replace (int begin, int end, String str) видаляє символи із рядка, починаючи з індексу begin включно до індекса end, якщо end є більшим за довжину рядка, тоді до кінця рядка, і вставляє замість них рядок str. Якщо begin є від’ємним, більшим за довжину рядка або більшим за end, тоді виникає виключна ситуація.
Метод reverse() змінює порядок розташування символів у рядку на зворотний порядок.
Наприклад, після виконання
StringBuffer s = new StringBuffer("Це невеликий рядок"),
reverse().toString();
одержимо s == "кодяр йикилевен еЦ".
Задача розбору введеного тексту (parsing) — вічна задача програмування, поруч із сортуванням і пошуком. Написана велика кількість програм-парсерів (parser), що розбирають текст за різними ознаками. Але задача залишається. У пакет java.util входить простий класс StringTokenizer, що полегшує розбір рядків. Класс StringTokenizer невеликий, у ньому є три конструктори і шість методів.
Перший конструктор StringTokenizer (String str) створює об’єкт, готовий розбити рядок str на слова, розділені так званими сепараторами - пробілами, символами табуляцій '\t', переводу рядка '\n' і повернення каретки '\r'. Сепаратори не включаються в число слів.
Другий конструктор StringTokenizer (String str. String delimeters) задає сепаратори другим параметром deІimeters, наприклад:
StringTokenizer("Їдемо,до, Києва,пробілів-немає", " \t\n\r,:-");
Тут перший сепаратор - пробіл. Потім ідуть символ табуляції, символ переводу рядка, символ повернення каретки, кома, двокрапка, дефіс. Порядок розташування сепараторів у рядку deІimeters не має значення. Сепаратори не включаються у число слів.
Третій конструктор дозволяє включити сепаратори у число слів:
StringTokenizer(String str, String deІimeters, boolean flag);
Якщо параметр flag дорівнює true, тоді сепаратори включаються у число слів, якщо false — тоді ні. Наприклад:
StringTokenizer("а - (b + с) / b * с", " \t\n\r+*-/(), true);
У розкладанні рядка на слова активно приймають участь два методи:
метод nextToken() повертає у вигляді рядка наступне слово;
логічний метод hasMoreTokens() повертає true, якщо у рядку ще є слова, і false, якщо слів більше немає.
Третій метод countTokens() повертає кількість слів, що залишилися.
Четвертий метод nextToken(string newDelimeters) дозволяє "на ходу" міняти сепаратори. Наступне слово буде виділене за новими сепараторами newDeІimeters; нові сепаратори діють далі замість старих, визначених у конструкторі або у попередньому методі nextToken().
Останні два методи nextEІement() і hasMoreEІements() реалізують інтерфейс Enumeration. Вони просто звертаються до методів nextToken () і hasMoreTokens():
Лістинг 2.2. Розбиття рядка на слова.
import java.util.*;
class Parse{
public static void main(String[] args){
String s = "String, which we want to decompose in words ";
StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Одержуємо слово і виводимо на екран
System.out.println(st.nextToken()) ;
}
}
}
Одержані слова звичайно заносяться у клас-коллекцію: Vector, Stack або інший, найбільш зручний контейнер для подальшої обробки тексту. Класи-колекції будуть розглянуті на наступних лабораторних роботах.
3.КОНТРОЛЬНІ ЗАПИТАННЯ
Які класи існують в Java для работи зі стрічками, і чим вони відрізняються один від одного?
Якими способами можна створити стрічку класу String в Java?
Які особливості реализації стрічок в Java необхідно враховувати при порівнянні стрічок?
Які методи порівняння стрічок визначені в Java?
Які методи пошуку символів і підстрічок в стрічках визначені в Java?
Як можна створити нову стрічку класe String на основі існуючої стрічки?
Як можна передати параметри програмі Java? В якому вигляді передаються ці параметри?
Який метод повинен обов’язково бути в програмі Java для того, щоб програма могла почати виконання і які модифікатори та параметри повинні бути задані для цього методу?
4.ЛАБОРАТОРНЕ ЗАВДАННЯ
Вивести рядок, довжиною N (N — парне), який складається із символів с1 і с2, що чергуються, починаючи з с1.
Маємо рядок. Підрахувати у ньому кількість цифр, великих і малих літер.
Маємо рядок S та число N. Перетворити рядок S у рядок довжини N таким чином: якщо довжина рядка S більша, ніж N, то відкинути перші символи, якщо довжина рядка S менша, ніж N то на його початок дописати символи '.' (крапка).
Дано два рядки: S1 і S2. Визначити кількість входжень підрядка S2 у рядок S1.
Даний рядок S і символ с. Подвоїти кожне входження символа с у рядок S.
Дано два рядки: S1 і S2. Видалити з рядка S1 всі підрядки, що збігаються з S2.
Дано три рядки: S1, S2, S3. Замінити у рядку S1 усі входження підрядка S2 на S3.
Дано рядок. Вивести порядок, розміщений між першою і останньою крапками початкового рядка.
Дано рядок, шо складається з українських слів, розділених пропусками. Визначити кількість слів у рядку.
Дано рядок, що складається із слів, розділених пропусками. Визначити кількість слів, шо містять хоча б одну букву 'а'.
Дано рядок, що складається із слів, розділених пропусками. Визначити кількість слів, шо містять рівно три букви 'а'.
Дано рядок, що складається із слів, розділених пропусками. Визначити довжини найкоротшого та найдовшого слів.
Дано рядок, що складається із слів, розділених одним або декількома пропусками Вивести рядок, що містить ці ж слова, але розділених одним пропуском.
Дано рядок, oо складається із слів, розділених пропусками. Вивести рядок, що містить ці ж слова, розділених одним пропуском, але розміщені у зворотному порядку.
Дано рядок, що складається із слів, розділених пропусками. Перетворити кожне слово у рядку, видаливши нього всі подальші входження першої букви цього слова.
Дано рядок, що складається із слів, розділених пропусками. Вивести рядок, що містить ці ж слова (розділених одним пропуском), але розмішені в алфавітному порядку.
Дано рядок-речення. Перетворити рядок так, щоб кожне слово починалося з великої букви.
Дано рядок, що містить повне ім’я файлу Виділити з рядка назву останнього каталога (без символів ‘\’). Якщо файл міститься у кореневому каталозі, то вивести символ ‘\’.
Дано рядок-речення на українській мові. Зашифрувати його, виконуючи циклічну заміну кожної букви на ту, що йде за нею в алфавіті, зберігаючи при цьому регістр букв ('А" перейде у "Б', 'а' - у 'б', 'Б' - у 'В', 'я' - у 'а' тощо).
Дано рядок-речення на українській мові і число k (0<k<10). Зашифрувати рядок, виконавши циклічну заміну кожної букви на букву того самого регістра, розмішену в атфавіті на k-й позиції після шифрованої букви (наприклад, для k=2 'А' перейде у 'В', 'а' - у 'в', 'Б' - у 'Г' тощо).
Дано рядок-речення. Зашифрувати його, помістивши спочатку всі символи, розміщені на парних позиціях, а потім у зворотному порядку всі символи, розміщені на непарних позиціях (наприклад, рядок 'Програма' перетвориться у 'ргамамроП').
Дано рядок, що містить декілька круглих дужок. Якщо дужки розставлені правильно (тобто кожній відкриваючій дужці відповідає одна закриваюча), то вивести число 0. Інакше вивести або номер позиції першої помилкової закриваючої дужки, або, якщо закриваючих дужок не вистачає, - число 1.
Написати програму, яка підраховує число слів у тексті. Розгляньте випадки, коли текст визначається в самій програмі і вводиться з командного рядка при запуску програми на виконання.
Написати програму, що записує текст у зворотному порядку. Розгляньте випадки, коли текст визначається в самій програмі і вводиться з командного рядка при запуску програми на виконання.
Написати програму, яка у рядку “This is a small string” замінить слово “small” на “very large”.
Написати програму, яка у рядку “This is a small string” видалить артикль “a” .
Написати програму, яка у рядку “This is a small string” видалить слово “small” .
Написати програму, яка у рядок “This is a small string” додасть слово “very” перед “small”.
Написати програму, яка у кінець рядка “This is a small string” додасть рядок “, that we use to ilustrate the methods of class StringBuffer” не створюючи нового рядка.
Написати програму, яка у рядку “This is a small string” замінить всі літери “i” на літеру “o”.
Написати програму, яка підраховує кількість символів у тексті. Розгляньте випадки, коли текст визначається у самій програмі і вводиться з командного рядка при запуску програми на виконання.
Написати програму, яка перевіряє, чи певне слово міститься у даному тексті. Розгляньте випадки, коли текст визначається у самій програмі і вводиться з командного рядка при запуску програми на виконання. Програма повинна розпізнавати слово незалежно від регістру, в якому воно записане.
Написати програму, яка перевіряє, чи певна літера міститься в даному тексті. Розгляньте випадки, коли текст визначається в самій програмі і вводиться з командного рядка при запуску програми на виконання. Програма повинна розпізнавати літеру незалежно від регістру, в якому вона записана.
Написати програму, яка підрахує скільки разів певне слово входить у даний текст незалежно від регістру, в якому воно написане.
Написати програму, яка підрахує скільки разів певна літера входить в даний текст незалежно від регістру, в якому вона написана.
Написати програму, яка обчислює відносну частоту появи кожного символу в даному тексті, включаючи знаки пунктуації і пробіли.
Написати програму, яка обчислює відносну частоту появи певного слова в даному тексті, незалежно від регістру.
5. ЗМІСТ ЗВІТУ
Мета роботи.
Короткі теоретичні відомості.
Файли проекту.
Аналіз результатів та висновки.
СПИСОК РЕКОМЕНДОВАНОЇ ЛІТЕРАТУРИ
Bruce Eckel, Thinking in Java, 2nd Edition, 2000.
Christopher Batty and David Scuse, Installing Eclipse. Department of Computer Science, University of Manitoba, Winnipeg, Manitoba, Canada, 2003.