9.00M
Категория: ПрограммированиеПрограммирование

Информатика программирование: Основы языка программирования JAVA

1.

Информатика
Программирование:
Основы языка программирования JAVA
Лекция 8, Часть 2
Строки
Доцент каф. ВММБ, к.т.н. Каменских Анна Александровна
Адрес кафедры ВММБ:108 к. Г (ул. Пр. Поздеева),
Тел. кафедры ВММБ: +7(342) 239-15-64
Электронная почта преподавателя: [email protected]

2.

Тип переменных String
Сохранить более одного символа можно в переменной типа String
String (строка) в языке Java – это основной носитель текстовой информации. Это не
массив символов типа char, а объект соответствующего класса.
JAVA
Для работы со
строками применяют
классы
Для форматирования и
обработки строк
применяются классы
java.lang.String
java.util.Formatter
java.lang. StringBuilder
java.util.regex.Pattern
java.lang. StringBuffer
java.util.regex.Matcher
и другие.
Создание строк
String str1 = new String(“Новая строка”); // создание с использованием оператора new
String str2 = “Новая строка”
// создание при помощи литерала
String[] str2 = {"Первый", "Второй", "Третий"}; // создание массива строк
String str3 = scn.nextLine (); // ввод строки с клавиатуры (Scanner scn = new
Scanner(System.in);)
! next(): считывает введенную строку до первого пробела
!! nextLine(): считывает всю введенную строку

3.

Класс String
Особенностью объекта класса String является то, что его значение не может быть изменено
после создания объекта при помощи какого-либо метода класса, так как любое изменение
строки приводит к созданию нового объекта.
Пример программы со строками
import java.util.Scanner;
public class StringMy {
public static void main(String args[]) {
Scanner scn = new Scanner(System.in);
String str1 = "Привет мир!";
//Создание строки при помощи литерала
String str2 = new String("!!!!!!"); //Создание строки
String str3 = scn.nextLine();
//Ввод строки с клавиатуры
String str = str1+" "+str2+" "+str3; //Создание строки из существующих строк
System.out.println(str);
char[] charMas = {'J','a','v','a',' ','m','y',' ','l','o','v','e','d',' ','l','a','n','g','u','a','g','e'};
String str4 = new String(charMas); //Создание строки из массива символов
System.out.println(str4);
}}

4.

Методы для работы со строками класса String
Примеры методов класса String
Во всех случаях вызова методов, изменяющих строку, создается новый объект типа String.
Импортирование класса:
import java.lang.String;
Список представленных методов не полный. Расширенный список можно посмотреть в
файле «К лекции 6», а так же в спецификации API java.lang.String.

5.

6.

Пример программы с использованием методов класса String
import java.util.Scanner;
Постановка задачи: В заданной строке
import java.lang.String;
вычислить количество слов начинающихся
public class Stroka {
и заканчивающихся на «a» (строчные и
public static void main(String args[]) {
прописные латинские буквы).
int sch = 0;
String S = "";
Scanner scn = new Scanner(System.in);
System.out.println("Введи строчку содержащую латинские слова");
String strochka = scn.nextLine(); // Ввод строки с консоли
String [] masStr = strochka.split(" "); //Разделение строки на массив строк, если слова через пробел
for (int i=0; i<=masStr.length-1;i++) {
if ((masStr[i].charAt(0)=='a' || masStr[i].charAt(0)=='A')) {
if ((masStr[i].charAt(masStr[i].length()-1)=='a' || masStr[i].charAt(masStr[i].length()-1)=='A')) {
sch++;
S = S + " " + masStr[i]; }}}
System.out.println();
if (sch > 0) {
System.out.println("Количество слов начинающихся и заканчивающихся на букву a равно " + sch);
System.out.println(S);
} else {
System.out.println("Cлов начинающихся и заканчивающихся на букву a нет");
}}}

7.

Пример программы с использованием пароля в виде символа
Постановка задачи: При сбое работы программы у пользователя спрашивается
продолжить ли ее работу, если да, тогда необходимо ввести символ «y», если нет – то
символ «n».
import java.util.Scanner;
public class Parol {
public static void main(String args[]) {
char yes = 'y', no = 'n';
Scanner scn = new Scanner(System.in);
System.out.println("Восстановить работу программы после сбоя?");
System.out.println("y - продолжить работу программы");
System.out.println("n - не продолжать работу программы");
String str = scn.next();
if (str.length()>1) {
System.out.println("Ошибка, повторите ввод");
} else { if (str.charAt(0) == yes) {System.out.println("Продолжить работу программы");
} else { if (str.charAt(0) == no) { System.out.println("Не продолжать работу программы");
} else { System.out.println("Ошибка, повторите ввод");
}
}
}
}
}

8.

Пример программы с анализом данных массива String
Постановка задачи: Дана матрица строк, которая содержит информацию по
аудиторному фонду по корпусам (1 ячейка – 1 аудитория). Посчитать количество
лекционных аудиторий в каждом корпусе и отдельно количество аудиторий с
мультимедийным оборудованием.
Структура данных
Регламентированный вид данных
Нерегламентированный вид данных
- Если для ввода данных определенный вид и их анализ строиться исходя из вида, то
должна быть проверка введенной структуры данных, так как если она не выполняется,
то анализ будет сделан с ошибками.
- Если регламентированной структуры данных нет, то анализ данных строиться с учетом
данного фактора.

9.

Программа для регламентированной структуры данных по аудиториям
import java.util.Scanner;
!!! В программе не учтена проверка
public class DataClass {
на структуру данных, программа
static Scanner in = new Scanner (System.in);
public static void main(String args[]) {
не универсальная.
int N = 12;
String Kampus [] = {"Корпус А","Корпус Б","Корпус В","Корпус Г"};
System.out.println("Данные об аудиториях");
System.out.println("Корпус;Номер аудитория;Тип аудитории;Мультимедийное оборудование;Количество компьютеров;Примечания");
String ClassRoom[] = new String[N];
int KampusRoom[][] = new int[2][Kampus.length];
String [] masStr;
for (int i=0; i < N; i++) {
ClassRoom[i] = in.nextLine();
}
for (int i = 0; i < N; i++) {
masStr = ClassRoom[i].split(";"); // Разбивка строк на массив строк по «;»
if (masStr[2].equals("Лекционная аудитория")) { // Проверка что в строке лек. ауд.
for(int j = 0; j < Kampus.length; j++) { // Массив по корпусам кампуса
if (masStr[0].equals(Kampus[j])) { // Проверка к какому корпусу относиться ауд.
KampusRoom[0][j] = KampusRoom[0][j] + 1; // Увеличение кол-ва лек. ауд.
if (masStr[3].equals("Установлено")) // Проверка есть ли оборудование
KampusRoom[1][j] = KampusRoom[1][j] + 1; }}}}
for(int i = 0; i < Kampus.length; i++) {
System.out.println();
System.out.print(Kampus[i] + ": лекционных аудиторий - " + KampusRoom[0][i]);
System.out.print(" , из них мультимедийных - " + KampusRoom[1][i]);
}
Вывод данных по корпусам о лекционных аудиториях
}}

10.

Ответ программы с регламентированной структурой данных по аудиториям
Проверка работы программы

11.

Поиск лекционных аудиторий по корпусам через сравнение строк
for (int i = 0; i < N; i++) {
masStr = ClassRoom[i].split(";");
if (masStr[2] == "Лекционная аудитория") {
for(int j = 0; j < Kampus.length; j++) {
if (masStr[0] == Kampus[j]) {
KampusRoom1[0][j] = KampusRoom1[0][j] + 1;
if (masStr[3] == "Установлено")
KampusRoom1[1][j] = KampusRoom1[1][j] + 1; }}}}
Такое сравнение
выполняет сравнение
ссылок (адресов в памяти),
а не самих строк.
Оператор == сравнивает ссылки (адреса в памяти).
По этому при проверке того же списка мы получим не верный ответ:
Если имеется в виду сравнение текста строк, а не ссылок, областей памяти и
прочего, то для сравнения строк ВСЕГДА используй метод equals().
Если в сравнении главным является именно последовательность конкретных
символов, а не их регистр, то используется метод equalsIgnoreCase().

12.

Программа для нерегламентированной структуры данных по аудиториям
import java.util.Scanner;
public class DataClass3 {
static Scanner in = new Scanner (System.in); contains() – метод чтобы проверить, содержит ли
String указанную последовательность символов.
public static void main(String args[]) {
int N = 12;
String Kampus [] = {"А","Б","В","Г"};
String S [] = {"корпус ", "к. ", "Корпус ", "К.", "корпуса ", "Корпуса "};
String LekcAud [] = {"лекционная","лек.","лекц.","лекцио-ая", "Лекц"};
System.out.println("Данные об аудиториях");
String ClassRoom[] = new String[N];
int KampusRoom[][] = new int[2][Kampus.length];
Метод concat() в Java добавляет одну
строку в конец к другой строке.
for (int i=0; i < N; i++) {
ClassRoom[i] = in.nextLine();
}
// Блок поиска лекционных аудиторий, в том числе с мультимедийным оборудованием
for (int i = 0; i < N; i++) {
for(int j = 0; j < LekcAud.length; j++) {
Проверка, что аудитория лекционная
if (ClassRoom[i].contains(LekcAud[j])) {
for (int k =0; k < Kampus.length; k++) {
Проверка лекционных
for(int l = 0; l < S.length; l++) {
аудиторий на
if (ClassRoom[i].contains(S[i].concat(Kampus[k]))) {
принадлежность корпусу
KampusRoom[0][k] = KampusRoom[0][k] + 1;
Проверка лекционных
if (ClassRoom[i].contains("мульт"))
KampusRoom[1][k] = KampusRoom[1][k] + 1;}}}}}}
аудиторий на
мультимедийность
for(int i = 0; i < Kampus.length; i++) {
System.out.println();
System.out.print("Корпус " + Kampus[i] + ": лекционных аудиторий - " + KampusRoom[0][i]);
System.out.print(" , из них мультимедийных - " + KampusRoom[1][i]); }
}
}
! Программа не универсальная.

13.

Ответ программы с регламентированной структурой данных по аудиториям
Проверка работы программы
!!! Остальные аудитории не возможно классифицировать по корпусу и т.д.

14.

Классы StringBuilder и StringBuffer
Cодержимое и размеры объектов классов StringBuilder и StringBuffer можно изменять.
Классы StringBuilder и StringBuffer являются «близнецами».
StringBuffer является потокобезопасным.
StringBuilder обладает высокой скоростью обработки.
Для создания нового объекта используется один из его конструкторов, например:
- StringBuffer() или StringBuilder() – создаст пустой (не содержащий символов) объект;
- StringBuffer(String str) или StringBuilder(String str) – создаст объект на основе
переменной str (содержащий все символы str в той же последовательности);
Примеры:
StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(“Java");
Сравнение классов

15.

Список методов, поддерживаемых классом StringBuffer (StringBuilder):
Список других методов (за исключением set), которые очень похожи на методы класса строк

16.

Пример программы с использованием переменных StringBuffer
Постановка задачи: В тексте после буквы Р, если она не последняя в слове, ошибочно
напечатана буква А вместо О. Внести исправления в текст.
public class Str {
public static void main(String args[]) {
String s = "Раманв теплице рАзусрезал для Разы. Раза была разового цвета. Раза очень была благодарна РАману.";
StringBuffer s2 = new StringBuffer(s);
System.out.println("Исходная строка");
System.out.println(s2);
for (int i = s2.length()-2; i>=0; i--) {
if ((s2.charAt(i)=='р' || s2.charAt(i)=='Р') && (s2.charAt(i+1)=='а' || s2.charAt(i+1)=='А')) {
s2.deleteCharAt(i+1);
s2.replace(i+1, i+1, "o");
}
}
System.out.println();
System.out.println("Строка после изменения");
System.out.println(s2);
}
}

17.

Пример программы с использованием переменных StringBuilder
Постановка: Дан текст, который является кодом программы на специализированном
языке. Из кода удалить все комментарии (!!, ?? – однострочные комментарии, <…> многострочные комментарии).
import java.util.Scanner;
public class Comenty {
static Scanner in = new Scanner (System.in);
public static void main(String args[]) {
System.out.println("Введите программу в виде строки");
String s = in.nextLine();
StringBuilder s2 = new StringBuilder(s);
System.out.println("Исходная строка");
System.out.println(s2);
for (int i = 0; i < s2.length()-1; i++) {
if ((s2.charAt(i) == '!' & s2.charAt(i+1) == '!' ) || (s2.charAt(i) == '?' & s2.charAt(i+1) == '?' )) {
s2.delete(i, s2.indexOf(".", i)+1);
} Поиск начала комментариев вида !! и ??, удаление подстроки до конца комментария «.»
if (s2.charAt(i) == '<') {
for (int j = i+1 ; j < s2.length(); j++) {
if (s2.charAt(j) == '>')
s2.delete(i, j+1);
}
Поиск начала комментариев вида <…>, удаление подстроки
}
}
System.out.println();
System.out.println("Строка после изменения");
System.out.println(s2);
}
! В данной программе считается, что однострочные комментарии заканчиваются
}
точкой. А так же не учтено, что комментариев может и не быть.

18.

Тестирование работы программы (Тест 1)
Тестирование работы программы (Тест 2)
Тестирование работы программы (Тест 3)
Комментарий не закрыт точкой
!!! Код программы требует доработки

19.

Регулярные выражения
В Java регулярные выражения представляют собой особую последовательность
символов, позволяющую вам сопоставить или выявить другие строки либо их набор,
опираясь на специализированный синтаксис в качестве шаблона.
Они могут быть использованы для поиска, редактирования либо манипулирования
текстом и данными.
Пакет java.util.regex исходно состоит из следующих трех классов:
Pattern Class – объект класса Pattern представляет скомпилированное представление
регулярного выражения. В классе Pattern публичный конструктор не предусмотрен. Для
создания шаблона, вам сперва необходимо вызвать один из представленных публичных
статичных методов compile(), который далее произведет возврат объекта класса Pattern.
Регулярное выражение в данных методах принимается как первый аргумент.
Matcher Class – объект класса Matcher представляет механизм, который интерпретирует
шаблон, а также производит операции сопоставления с вводимой строкой. Аналогично
классу Pattern, Matcher не содержит публичных конструкторов. Объект класса Matcher
может быть получен путем вызова метода matcher() на объекте класса Pattern.
PatternSyntaxException – объект класса PatternSyntaxException представляет
непроверяемое исключение, которое обозначает синтаксическую ошибку в шаблоне
регулярного выражения.

20.

Класс Pattern
Класс Pattern – это конструктор регулярных выражений.
Регулярное выражение – это шаблон для поиска строки в тексте.
Экземпляр класса Pattern представляет собой скомпилированное регулярное выражение,
известное также как шаблон. Регулярные выражения компилируются с целью повышения
производительности операций поиска по шаблону.
Создание регулярных выражений в Java:
- написать его в виде строки с учётом синтаксиса регулярных выражений;
- скомпилировать эту строку в регулярное выражение.
Синтаксис регулярных выражений основан на использовании символов
<([{\^-=$!|]})?*+.>,
которые можно комбинировать с буквенными символами. В зависимости от роли их можно
разделить на несколько групп:
- Метасимволы для поиска совпадений границ строк или текста;
- Метасимволы для поиска символьных классов;
- Метасимволы для поиска символов редактирования текста;
- Метасимволы для группировки символов;
- Метасимволы для обозначения количества символов – квантификаторы.
Квантификатор всегда следует после символа или группы символов.
Существует еще два типа квантификаторов, которые образованы прибавлением суффикса
-«?» (слабое или неполное совпадение);
- «+» («жадное» или Собственное совпадение) к вышеперечисленным квантификаторам.
Неполное совпадение соответствует выбору с наименее возможным количеством
символов, а собственное – с максимально возможным.

21.

22.

Метасимволы для поиска
совпадений границ строк или текста
Метасимволы для поиска
символьных классов
Метасимволы для группировки символов
Метасимволы для поиска символов
редактирования текста
Метасимволы для
обозначения количества символов

23.

Методы класса Pattern
Класс Matcher
Matcher – класс, который представляет строку, реализует механизм согласования
(matching) с регулярным выражением и хранит результаты этого согласования (используя
реализацию методов интерфейса MatchResult).
Не имеет публичных конструкторов, поэтому для создания объекта этого класса нужно
использовать метод matcher класса Pattern:
Методы индексов

24.

Методы исследования
Методы замены

25.

Класс PatternSyntaxException
PatternSyntaxException представляет непроверяемое исключение, которое отображает
синтаксическую ошибку в шаблоне регулярного выражения.
Методы определения ошибок
Pattern и Matcher
Создается шаблон Pattern
(регулярное выражение)
Создается Matcher для работы
с (регулярными выражениями)
Редактирование строк с
использованием методов
Matcher
Анализ строковых данных с
использованием методов Matcher

26.

Пример программы с использованием регулярных выражений
Постановка задачи: В массиве строк, содержащих информацию о студентах, найти
студентов специальности ИСТ и вывести их на экран.
import java.util.Scanner;
Программа ищет шаблон в
import java.util.regex.*;
строчках по элементам массива
public class Str2 {
и при наличии отыскании
public static void main(String args[]) {
студентов группы ИСТ выводит
Scanner scn = new Scanner(System.in);
System.out.println("Введи кол-во строк в массиве"); их данные на консоль.
int N = scn.nextInt();
String [] mas2 = new String[N];
System.out.println("Введи ФИО студента и его группу");
for (int i = 0; i<N; i++) {
mas2[i] = scn.nextLine();
}
Pattern pat1 = Pattern.compile ("ИСТ");
System.out.println();
System.out.println("Найти студентов групп " + pat1);
Matcher mat1;
for (int i = 0; i<N; i++) {
mat1 = pat1.matcher(mas2[i]);
if (mat1.find()) {
System.out.println(mas2[i]);
}
}
}
}

27.

Пример программы редактирования текста с использованием РВ
Постановка задачи: В тексте после буквы Р, если она не последняя в слове, ошибочно
напечатана буква А вместо О. Внести исправления в текст.
import java.util.regex.*;
public class Str2 {
public static void main(String args[]) {
String s="Раман в теплице рАзу срезал для Разы. Раза была разового цвета. Раза очень была благодарна РАману.";
System.out.println("Исходная строка");
System.out.println(s);
String Patt[] = {"Ра", "РА", "ра", "рА"}; // Для формирования регулярных выражений
String ZamPatt[] = {"Ро", "Ро", "ро", "ро"}; // Для замены регулярных выражений
Pattern pat1;
Matcher mat1;
for (int i = 0; i < Patt.length; i++) {
pat1 = Pattern.compile(Patt[i]); // Возвращает Pattern
mat1 = pat1.matcher(s); // Возвращает Matcher
if (mat1.find()) { // Проверка есть ли в строке регулярное выражение
s = mat1.replaceAll(ZamPatt[i]); // Замена всех вхождений РВ на строку из массива
}
}
System.out.println();
System.out.println("Строка после изменения");
System.out.println(s);
}
}

28.

Пример программы с использованием регулярных выражений
Постановка задачи: В массиве строк необходимо: найти строки с многоточиями и
заменить многоточия на «ФПММ»; найти строки с «ПНИПУ» и заменить
аббревиатуру на «ИСТ».
import java.util.Scanner;
import java.util.regex.*;
public class Str3 {
public static void main(String args[]) {
Scanner scn = new Scanner(System.in);
String [] mas2 = {"Команда ПНИПУ выиграла соревнования",
"Доцент .. Иванов А.А. стал лауреатом премии ... за развития НИРС на ..",
"ПНИПУ ты супер!",
"На .. проходят соревнования студентов ... среди спортивных команд .. и ... не знает, что будет с ....",
"Ля-ля-ля-ля-ля",
"ФПММ супер",
"Все отличники ПНИПУ учатся на ФПММ"};
System.out.println("Массив строк");
printMas(mas2);
System.out.println();
Pattern pat1 = Pattern.compile ("[.]{2,}");
Pattern pat2 = Pattern.compile ("ПНИПУ");
Matcher mat1, mat2;
for (int i = 0; i<mas2.length; i++) {
mat1 = pat1.matcher(mas2[i]);
mat2 = pat2.matcher(mas2[i]);
if (mat1.find()) {
mas2[i] = mat1.replaceAll("ФПММ");
} else { if (mat2.find()) {
mas2[i] = mat2.replaceAll("ИСТ");
}}}
System.out.println("Массив строк после изменения");
printMas(mas2);
Программа редактирует содержание строк в
}
массиве при наличии двух типов регулярных
public static void printMas(String[] array) {
for (int i=0; i<=array.length-1; i++) {
выражений.
Редактирование
данных
System.out.println(array[i]);
зависит от типа РВ.
}
}}

29.

Класс Formatter
Для
создания
форматированного
текстового
вывода
предназначен
класс
java.util.Formatter.
Этот класс обеспечивает преобразование формата, позволяющее выводить числа, строки,
время и даты в любом необходимом разработчику виде.
Java.util.Formatter – представляет собой класс общего назначения Java, полностью
оснащенный для форматирования.
- buf задает буфер для форматированного вывода.
- Если buf равен null, класс автоматически размещает
Formatter()
объект
типа
StringBuilder
для
хранения
Formatter(Appendable buf)
форматированного вывода.
Formatter(Appendable buf, Locale loc) - loc определяет региональные и языковые настройки.
- filename задает имя файла, который получит
Formatter(String filename)
форматированный вывод.
Formatter(String filename, String charset) - charset определяет кодировку.
Formatter(File outF)
-outF передает ссылку на открытый файл, в котором будет
храниться форматированный вывод.
Formatter(OutputStream outStrm)
-outStrm передается ссылка на поток вывода, который
Formatter(PrintStream printStrm)
будет получать отформатированные данные.
Если никаких настроек не задано, используются настройки по умолчанию.
Если не задан параметр кодировки, то используется кодировка, установленная по умолчанию.
Если используется файл, выходные данные записываются в файл.
Formatter f = new Formatter(); // объявление объекта

30.

Методы класса Formatter
При форматировании используются спецификаторы формата.
Например: %a – шестнадцатеричное значение с плавающей точкой.
Также возможны спецификаторы с заглавными буквами: %A (эквивалентно %a).
Форматирование с их помощью обеспечивает перевод символов в верхний регистр.

31.

Спецификаторы формата
Спецификатор точности применяется только в спецификаторах формата %f, %е, %g для
данных с плавающей точкой и в спецификаторе %s — для строк.
Он задает количество выводимых десятичных знаков или символов.
- спецификатор %10.4f выводит число с минимальной шириной поля 10 символов и с
четырьмя десятичными знаками.
- спецификатор %5.7s выводит строку длиной не менее пяти и не более семи символов,
если строка длиннее, конечные символы отбрасываются.

32.

Спецификаторы для форматирования даты и времени
Могут употребляться только для типов long, Long, Calendar, Date.

33.

Пример программы с использованием Formatter
import java.util.Formatter;
public class Forma {
public static void main(String args[]) {
Formatter f = new Formatter();
f.format("Набор %S %d %s", "фпмм", 2019, "года");
System.out.println(f);
f = new Formatter();
f.format("16-ое значение числа %d = %x 8-ое = %o", 100, 100, 100);
System.out.println(f);
f = new Formatter();
f.format("%a", 20.1);
System.out.println(f);
f = new Formatter();
System.out.println();
for (double i = 1000; i < 1.0e+10; i *= 100) {
f.format("%g ", i);
System.out.println(f);
}
}
}
English     Русский Правила