Java: Символы строки
Иногда из строки нужно достать один символ. Сайт знает имя и фамилию пользователя, а вывести их хочет в сокращенном виде A. Ivanov. Для этого берут первую букву имени и ставят рядом точку.
В Java каждый символ строки имеет свой номер, который называют индексом. Отсчет начинается с нуля. У первого символа индекс 0, у второго 1 и дальше по порядку. Чтобы достать символ по индексу, у строки вызывают метод charAt(). Внутри скобок указывают нужный индекс.
var firstName = "Alexander";
System.out.println(firstName.charAt(0)); // => AМетод charAt() вызывается у строки через точку. В скобках стоит аргумент 0, поэтому метод вернет самый первый символ. Структура такая же, как у других строковых методов. Сначала объект, потом точка, потом имя метода и скобки с аргументом.
Связь между символами и их индексами видно на схеме:
Символ A l e x a n d e r
Индекс 0 1 2 3 4 5 6 7 8Длина строки Alexander равна 9, поэтому индекс последнего символа равен 8, то есть 9 - 1. Чтобы достать последний символ, передают именно этот индекс:
var firstName = "Alexander";
System.out.println(firstName.charAt(8)); // => rЧто возвращает метод
Метод charAt() возвращает один символ. В Java для одиночного символа есть отдельный тип данных char. Значение типа char записывают в одинарных кавычках, например 'A'. Строка из двойных кавычек и одиночный символ из одинарных кавычек относятся к разным типам.
var firstName = "Alexander";
var letter = firstName.charAt(0);
System.out.println(letter); // => AЗдесь результат вызова сохраняется в переменную letter. Это удобно, когда символ нужен дальше в коде. Но переменная не обязательна, метод можно вывести сразу:
System.out.println("Hexlet".charAt(0)); // => HМетод вызывается прямо у строкового литерала "Hexlet". Сначала вычисляется charAt(0), затем результат уходит в println().
Выход за границы строки
Индекс должен попадать внутрь строки. Если передать индекс больше последнего, программа завершится с ошибкой:
var firstName = "Alexander";
System.out.println(firstName.charAt(9));
// StringIndexOutOfBoundsExceptionВ строке Alexander девять символов с индексами от 0 до 8. Индекса 9 нет, поэтому метод выбрасывает ошибку StringIndexOutOfBoundsException. Поэтому при работе с символами сначала проверяют длину строки и обращаются к символу только тогда, когда индекс точно внутри границ. Этот прием разбирается дальше в курсе.
Спецсимволы
Метод charAt() считает все символы подряд. Не только буквы и знаки, но и спецсимволы. Каждый из них занимает свою позицию и имеет индекс, даже если на экране его не видно.
Например, в строке "\nyou" под индексом 0 стоит \n (перенос строки), а под индексом 1 уже идет буква y. Поэтому вызов magic.charAt(1) вернет именно y.
var magic = "\nyou";
System.out.println(magic.charAt(1)); // => yЗадание
Выведите на экран второй символ строки "Hexlet". Используйте метод charAt() и помните, что индексы начинаются с нуля.
Ожидаемый вывод:
eJava: Символы строки
Иногда из строки нужно достать один символ. Сайт знает имя и фамилию пользователя, а вывести их хочет в сокращенном виде A. Ivanov. Для этого берут первую букву имени и ставят рядом точку.
В Java каждый символ строки имеет свой номер, который называют индексом. Отсчет начинается с нуля. У первого символа индекс 0, у второго 1 и дальше по порядку. Чтобы достать символ по индексу, у строки вызывают метод charAt(). Внутри скобок указывают нужный индекс.
var firstName = "Alexander";
System.out.println(firstName.charAt(0)); // => AМетод charAt() вызывается у строки через точку. В скобках стоит аргумент 0, поэтому метод вернет самый первый символ. Структура такая же, как у других строковых методов. Сначала объект, потом точка, потом имя метода и скобки с аргументом.
Связь между символами и их индексами видно на схеме:
Символ A l e x a n d e r
Индекс 0 1 2 3 4 5 6 7 8Длина строки Alexander равна 9, поэтому индекс последнего символа равен 8, то есть 9 - 1. Чтобы достать последний символ, передают именно этот индекс:
var firstName = "Alexander";
System.out.println(firstName.charAt(8)); // => rЧто возвращает метод
Метод charAt() возвращает один символ. В Java для одиночного символа есть отдельный тип данных char. Значение типа char записывают в одинарных кавычках, например 'A'. Строка из двойных кавычек и одиночный символ из одинарных кавычек относятся к разным типам.
var firstName = "Alexander";
var letter = firstName.charAt(0);
System.out.println(letter); // => AЗдесь результат вызова сохраняется в переменную letter. Это удобно, когда символ нужен дальше в коде. Но переменная не обязательна, метод можно вывести сразу:
System.out.println("Hexlet".charAt(0)); // => HМетод вызывается прямо у строкового литерала "Hexlet". Сначала вычисляется charAt(0), затем результат уходит в println().
Выход за границы строки
Индекс должен попадать внутрь строки. Если передать индекс больше последнего, программа завершится с ошибкой:
var firstName = "Alexander";
System.out.println(firstName.charAt(9));
// StringIndexOutOfBoundsExceptionВ строке Alexander девять символов с индексами от 0 до 8. Индекса 9 нет, поэтому метод выбрасывает ошибку StringIndexOutOfBoundsException. Поэтому при работе с символами сначала проверяют длину строки и обращаются к символу только тогда, когда индекс точно внутри границ. Этот прием разбирается дальше в курсе.
Спецсимволы
Метод charAt() считает все символы подряд. Не только буквы и знаки, но и спецсимволы. Каждый из них занимает свою позицию и имеет индекс, даже если на экране его не видно.
Например, в строке "\nyou" под индексом 0 стоит \n (перенос строки), а под индексом 1 уже идет буква y. Поэтому вызов magic.charAt(1) вернет именно y.
var magic = "\nyou";
System.out.println(magic.charAt(1)); // => yЗадание
Выведите на экран второй символ строки "Hexlet". Используйте метод charAt() и помните, что индексы начинаются с нуля.
Ожидаемый вывод:
eВаше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "e";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
