Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.List;
- import java.util.stream.Collectors;
- import java.util.stream.IntStream;
- public class Task3 {
- public static void main(String[] args) {
- //todo main
- List<String> poem = new ArrayList<>(List.of(
- "A solis ortu usque ad occasum",
- "A prima facie никто",
- "В клоаке снега тщетных обещаний",
- "Найду себе ab ovo самого",
- "и как бы не старался сгинуть",
- "В дисперсии прекрасного ума",
- "Как зиккурат статичен и стабилен",
- "Над энтропийными оркестрами себя"));
- System.out.println("Исходный стих: ");
- poem.stream().forEach(System.out::println);
- System.out.println("\nTask2_1 ____________________________________________");
- //Вывод варианта поиска только 'О' символа:
- System.out.
- printf("Task1: Англ букв 'O' = %s, Русских букв 'O' = %s \n",
- countCharOInText(poem)[0],
- countCharOInText(poem)[1]);
- System.out.println("\nTask2_2 ____________________________________________");
- System.out.println("toUpperCase: ");
- System.out.println(toUppercase(poem));
- System.out.println("\nTask2_3 ____________________________________________");
- convertTextToAlternatingRegister(poem).stream().forEach(System.out::println);
- System.out.println("\nTask2_4 ____________________________________________");
- divideIntoStanzas(poem).stream().forEach(System.out::println);
- System.out.println("\nTask2_4StreamAPI ____________________");
- divideIntoStanzasStreamAPI(poem).stream().forEach(System.out::println);
- }
- //todo 1) Необходимо посчитать и вывести количество английских и русских букв 'o' в стихотворении
- //вариант поиска только 'О' символа:
- public static int[] countCharOInText(List<String> poem) {
- int countOfEng = 0;
- int countOfRus = 0;
- for (String s : poem) {
- for (int i = 0; i < s.length(); i++) {
- // fixme: Здесь можно упростить до:
- // if (s.toLowerCase().charAt(i) == 'o') {
- // countOfEng++;
- // }
- // if (s.toLowerCase().charAt(i) == 'о') {
- // countOfRus++;
- // }
- if (s.toLowerCase().charAt(i) == Character.toLowerCase('o')) countOfEng++;
- else if (s.toLowerCase().charAt(i) == Character.toLowerCase('о')) countOfRus++;
- }
- }
- return new int[]{countOfEng, countOfRus};
- }
- // todo 2) Необходимо каждое слово с тремя и более русскими гласными перевести в верхний регистр
- //Здесь не сразу допер раскидать по отдельным методам, поэтому такая вложенность.
- public static String toUppercase(List<String> poem) {
- String vowelLetters = "аеёиоуыэюя";
- // fixme: я убрал StringBuilder и сделал индексированный цикл ради строки 85
- for (int j = 0; j < poem.size(); j++) {
- String s = poem.get(j);
- String[] words = s.split(" ");
- for (String word : words) {
- int vowelCount = 0;
- for (int i = 0; i < word.length(); i++) {
- // fixme: Просто как вариант, который мне кажется слегка покороче:
- // if (vowelLetters.contains(String.valueOf(word.toLowerCase().charAt(i)))) vowelCount++;
- if (vowelLetters.contains(String.valueOf(Character.toLowerCase(word.charAt(i))))) vowelCount++;
- }
- if (vowelCount >= 3) {
- // fixme: Убрал StringBuilder. Мне кажется, что твоё решение было достойным, но оно добавляло лишние пробелы в конце каждой строки.
- // Таким образом, представь, что эти пробелы (хоть и не видны) - дополнительные символы. Это по сути меняет исходный текст, делая его больше
- s = s.replaceAll(word, word.toUpperCase());
- poem.set(j, s);
- }
- }
- }
- // Возвращаю строку, используя Stream API
- return poem.stream().collect(Collectors.joining("\n"));
- }
- // todo 3) Каждое пятое слово вне зависимости от предыдущих пунктов перевести в чередующийся регистр (Начинается с верхнего, Sergey -> SeRgEy)
- public static List<String> convertTextToAlternatingRegister(List<String> poem) {
- List<String> result = new ArrayList<>();
- int count = 1;
- for (String line : poem) { //для каждого предложения
- String[] wordsArray = line.split(" ");
- StringBuilder convertedLine = new StringBuilder();
- for (int i = 0; i < wordsArray.length; i++) { // для каждого слова
- if (count % 5 == 0) {
- wordsArray[i] = convertWord(wordsArray[i]);
- }
- count++;
- convertedLine.append(wordsArray[i]).append(" ");
- }
- // fixme: Хорошее решение! И как раз .trim() для отрезания лишних пробелов. Ну а так, можно и как выше (в задаче 2) руководствоваться .replace.
- // В целом, отлично, но как будто с .replace подходом поприятнее - нам не нужно думать о пробелах и их удалении как в этом случае :)
- result.add(convertedLine.toString().trim());
- }
- return result;
- }
- public static String convertWord(String str) {
- String result = "";
- for (int i = 0; i < str.length(); i++) {
- if (i % 2 == 0) result += Character.toUpperCase(str.charAt(i));
- else result += str.charAt(i);
- }
- return result;
- }
- //todo 4) Разделить стихотворение по строфам (4 строки) отступом (то есть после 4-х строк должна идти
- // пустая перед продолжением последующих) и поставить точки в конце каждой строфы.
- public static List<String> divideIntoStanzas(List<String> poem) {
- List<String> result = new ArrayList<>();
- int count = 1;
- for (String line : poem) {
- if (count % 4 == 0) {
- result.add(editLine(line));
- } else result.add(line);
- count++;
- }
- return result;
- }
- public static String editLine(String line) {
- // fixme: опять же, как будто однострочное решение поприятнее:
- return line + ".\n";
- // StringBuilder stringBuilder = new StringBuilder(line);
- // return stringBuilder.append(".").append("\n").toString();
- }
- // fixme: Давай я напишу пример использования Stream API для последней задачки, например.
- // Насколько мы помним - всё, что связано с итерацией данных (циклами) может быть представлено в виде обработки стрима
- // Да, иногда это может быть хитро и нетривиально, но в целом ради практики стоит попробовать
- public static List<String> divideIntoStanzasStreamAPI(List<String> poem) {
- // Здесь для удобства мы используем IntStream.range(*НАЧАЛО*, *КОНЕЦ*).
- // Это позволяет нам представить индексируемый цикл и взаимодействовать с нашим индексом (i)
- return IntStream.range(0, poem.size())
- .mapToObj(i -> {
- if ((i + 1) % 4 == 0) {
- return editLine(poem.get(i));
- }
- return poem.get(i);
- }).toList();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement