java-lekcii-2016-01-17 / presentation-oct-17
.docxjava.lang.String
Класс String используется в Java для работы со строками, т.е. последовательностями символов. Фактически класс является оберткой массива символов (char[]).
Работа со строками
package ru.mami;
public final class StringExercises {
public static void main(String[] args) {
// Объявление строки
String line;
// Задание значения
line = "The quick brown fox jumps over the lazy dog";
// Объявление и задание значения одной строкой
String newLine = "The quick brown fox jumps over the lazy dog";
// Объединение строк
String concLine = "The quick" + " brown fox";
System.out.println(concLine); // The quick brown fox
// Получение длины строки
int length = line.length();
System.out.println(length); // 43
// Поиск подстроки в строке
int index = line.indexOf("quick");
System.out.println(index); // 4
// Получение части строки с определенной позиции и до конца строки
String subLine = line.substring(20);
System.out.println(subLine); // jumps over the lazy dog
// Получение части строки с определенной позиции до другой позиции
subLine = line.substring(20, 25);
System.out.println(subLine); // jumps
// Получение символа, стоящего на определенной позиции
char character = line.charAt(20);
System.out.println(character); // j
// Сравнение строк
// !!! Для сравнения строк нельзя использовать ==
boolean linesEqual = line.equals(newLine);
System.out.println(linesEqual); // true
// Дополнительная информация
// https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
}
}
Методы
Метод – группа выражений, объединенных для выполнения какой-либо операции.
Объявление метода
package ru.mami;
import java.util.Arrays;
public final class StringExercises {
public static void main(String[] args) {
int[] ints = { 1, 2, 3, 4 };
// Использование метода printIntArray
printIntArray(ints); // [1, 2, 3, 4]
// Использование метода sumElement
System.out.println(sumElements(ints)); // 10
}
//
// Модификатор видимости
// || Принадлежит ли конкретному объекту класса
// || || Тип возвращаемого значения (void = не возвращает ничего)
// || || || Название метода
// || || || || Принимаемые параметры
// || || || || ||
// \/ \/ \/ \/ \/
private static void printIntArray(int[] array) {
System.out.println(Arrays.toString(array));
}
private static int sumElements(int[] array) {
int result = 0;
for (int current : array) {
result += current;
}
// Выход из функции и возврат определенного значения в место вызова
// метода. Операторов return может быть несколько (они также могут
// отсутствовать, тогда выход из метода происходит после выполнения
// последней строки метода) и они могут встречаться в теле метода
// где угодно.
return result;
}
}
Примеры
Пример 1 (предыдущая лабораторная)
Условие
Имея массив целых чисел numbers и цифру digitSought, найти хотя бы один элемент массива, содержащий эту цифру. Поиск проводить только в четных элементах.
Например, для массива {13, -45, 42, 18} и цифры 4 нужно вывести «Цифра 4 содержится в числе 42», так как число -45 нечетное.
Для массива {13, -45, 42, 18} и цифры 3 нужно вывести «Соответствующий условию элемент массива найти не удалось», так как она не содержится в четных элементах массива.
Решение с использованием методов
package ru.mami;
public final class StringExercises {
public static void main(String[] args) {
int[] numbers = { -12, 33, -43, -47, 84, 90, 67 };
int digitSought = 4;
boolean digitFound = false;
for (int numberCurrent : numbers) {
if (numberFits(numberCurrent, digitSought)) {
System.out.println("Цифра " + digitSought
+ " содержится в числе " + numberCurrent);
digitFound = true;
break;
}
}
if (!digitFound) {
System.out.println(
"Соответствующий условию элемент массива найти не удалось");
}
}
private static boolean numberFits(int number, int digit) {
if (!numberIsEven(number)) {
return false;
}
if (!numberContainsDigit(number, digit)) {
return false;
}
return true;
}
private static boolean numberIsEven(int number) {
return number % 2 == 0;
}
private static boolean numberContainsDigit(int number, int digit) {
number = Math.abs(number);
while (number != 0) {
int remainder = number % 10;
if (remainder == digit) {
return true;
}
number /= 10;
}
return false;
}
}
Пример 2
Условие
Написать метод, который принимает имя в виде строки (например, "Bob") и выводит приветствие на экран (например, "Hello Bob!").
Решение
package ru.mami;
public final class StringExercises {
public static void main(String[] args) {
greet("Mike");
}
private static void greet(String name) {
String greeting = "Hello " + name + "!";
System.out.println(greeting);
}
}
Пример 3
Условие
Написать метод, который получает строку и выводит ее на экран, удваивая все символы (“Hey” -> “HHeeyy”).
Решение
package ru.mami;
public final class StringExercises {
public static void main(String[] args) {
doubleChars("Mike");
}
private static void doubleChars(String text) {
multiplyChars(text, 2);
}
private static void multiplyChars(String text, int multiplier) {
for (int i = 0; i < text.length(); ++i) {
char current = text.charAt(i);
for (int j = 0; j < multiplier; ++j) {
System.out.print(current);
}
}
}
}
Пример 4
Условие
Написать метод, который получает строку и возвращает количество слов, оканчивающихся на ‘y’ или ‘z’. Слова разделены символами, которые не являются буквами. Для проверки, является ли символ буквой, использовать метод класса Character isLetter().
Решение
package ru.mami;
public final class StringExercises {
public static void main(String[] args) {
int count = countYZ("foo bar baz");
System.out.println(count);
}
private static int countYZ(String text) {
int result = 0;
int indexCurrent = 0;
while (indexCurrent < text.length()) {
char charCurrent = text.charAt(indexCurrent);
if (charCurrent == 'y' || charCurrent == 'z') {
int indexNext = indexCurrent + 1;
if (indexNext >= text.length()
|| !Character.isLetter(text.charAt(indexNext))) {
++result;
}
}
++indexCurrent;
}
return result;
}
}
Упражнения
Все упражнения предполагают создание как минимум одного метода. В методе main может происходить только вызов других методов и вывод результата на экран, если по условию задачи нужно вернуть результат, а не вывести его на экран.
Easy
-
Получив строку длиной 4 символа и слово вернуть новую строку, в которой слово стоит в середине первой строки ("<<>>", "Yay" => "<<Yay>>").
-
Получив строку четной длины, вернуть первую ее половину (“WooHoo” => “Woo”).
-
Получив строку и переменную типа boolean, вернуть в виде новой строки первый символ исходной строки, если значение переменной – true, и последний в противоположном случае (“Hello”, true => “H” | “Hello”, false => “o”).
-
Получив строку, вернуть true, если она оканчивается на “ly” (“Oddly” => true | “y” => false).
-
Получив строку нечетной длины, вернуть в качестве новой строки три средних символа. Исходная строка не может быть короче 3 символов (“Candy” => “and”).
Medium
-
Получить строку и подсчитать, сколько раз в ней встречается слово “code”. Вместо ‘d’ может быть любой символ, т.е. слова “cope” и “cooe” тоже считаются (“codeqcopedcoxe” => 3).
-
Получив строку и целое число N, вернуть новую строку, содержащую N последних символов оригинальной строки, повторенных N раз (“Hello”, 3 => “llollollo”). N может принимать значения от 0 включительно до длины исходной строки.
-
Получив строку и целое число N, вернуть true, если подстрока, состоящая из первых N символов строки, присутствует в строке где-то еще (“assassin”, 3 => true | “ssss”, 3 => true | “hello”, 2 => false).
-
Получив строку, вернуть true, если для каждого символа ‘*’ символы, идущие сразу перед и после него отсутствуют или одинаковы (“y*y” => true | “asdf*” => true | “*” => true | “a*s*s” => false).
-
Получив строку, вернуть true, если в середине строки присутствует подстрока “xyz”. “В середине” означает, что количество символов справа и слева он “xyz” отличается не больше чем на 1 (“AAxyzBB” => true | “AxyzBB” => ture | “AxyzBBB” => false).
Hard
-
Получив строку, вернуть наиболее длинную подстроку, присутствующую в начале и в конце исходной строки. Пересечения не учитывать (“abXab” => “ab” | “xx” => “x” | “xxx” => “x”).
-
Получив строку, вернуть сумму всех чисел в этой строке. Под числом подразумевается несколько цифр, идущих подряд. Для проверки, является ли символ цифрой, можно использовать метод Character.isDigit(), для преобразования строки в число – Integer.parseInt(). (“12s4” => 16)
-
Получив строку, вернуть самую длинную подстроку, присутствующую в начале строки и в конце строки в обратной последовательность. Пересечения возможны (“abXYZba” => “ab” | “zxyxz” => “zxyxz” | “zy” => “”).
-
Получив строку, вернуть новую строку, в которой каждое встреченное в исходной строке “is”, перед и после которого не стоит другая буква (проверять при помощи Character.isLetter()), заменено на “is not” (“This is a test” => “This is not a test”).
-
Получив строку, вернуть длину самой большой группы одинаковых символов, стоящих на соседних позициях (“aassssddddf” => 4).