Advertisement
liwgfr

Untitled

Feb 6th, 2024
924
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.96 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import java.util.stream.IntStream;
  5.  
  6. public class Task3 {
  7.     public static void main(String[] args) {
  8. //todo main
  9.         List<String> poem = new ArrayList<>(List.of(
  10.                 "A solis ortu usque ad occasum",
  11.                 "A prima facie никто",
  12.                 "В клоаке снега тщетных обещаний",
  13.                 "Найду себе ab ovo самого",
  14.                 "и как бы не старался сгинуть",
  15.                 "В дисперсии прекрасного ума",
  16.                 "Как зиккурат статичен и стабилен",
  17.                 "Над энтропийными оркестрами себя"));
  18.         System.out.println("Исходный стих: ");
  19.         poem.stream().forEach(System.out::println);
  20.  
  21.         System.out.println("\nTask2_1 ____________________________________________");
  22.         //Вывод варианта поиска только 'О' символа:
  23.         System.out.
  24.                 printf("Task1: Англ букв 'O' = %s, Русских букв 'O' = %s \n",
  25.                         countCharOInText(poem)[0],
  26.                         countCharOInText(poem)[1]);
  27.  
  28.         System.out.println("\nTask2_2 ____________________________________________");
  29.         System.out.println("toUpperCase: ");
  30.         System.out.println(toUppercase(poem));
  31.  
  32.  
  33.         System.out.println("\nTask2_3 ____________________________________________");
  34.         convertTextToAlternatingRegister(poem).stream().forEach(System.out::println);
  35.  
  36.         System.out.println("\nTask2_4 ____________________________________________");
  37.         divideIntoStanzas(poem).stream().forEach(System.out::println);
  38.  
  39.         System.out.println("\nTask2_4StreamAPI ____________________");
  40.         divideIntoStanzasStreamAPI(poem).stream().forEach(System.out::println);
  41.  
  42.     }
  43.  
  44.  
  45.     //todo 1) Необходимо посчитать и вывести количество английских и русских букв 'o' в стихотворении
  46.     //вариант поиска только 'О' символа:
  47.     public static int[] countCharOInText(List<String> poem) {
  48.         int countOfEng = 0;
  49.         int countOfRus = 0;
  50.  
  51.         for (String s : poem) {
  52.             for (int i = 0; i < s.length(); i++) {
  53.                 // fixme: Здесь можно упростить до:
  54. //                if (s.toLowerCase().charAt(i) == 'o') {
  55. //                    countOfEng++;
  56. //                }
  57. //                if (s.toLowerCase().charAt(i) == 'о') {
  58. //                    countOfRus++;
  59. //                }
  60.                 if (s.toLowerCase().charAt(i) == Character.toLowerCase('o')) countOfEng++;
  61.                 else if (s.toLowerCase().charAt(i) == Character.toLowerCase('о')) countOfRus++;
  62.             }
  63.         }
  64.         return new int[]{countOfEng, countOfRus};
  65.     }
  66.  
  67.  
  68.     // todo 2) Необходимо каждое слово с тремя и более русскими гласными перевести в верхний регистр
  69.     //Здесь не сразу допер раскидать по отдельным методам, поэтому такая вложенность.
  70.     public static String toUppercase(List<String> poem) {
  71.         String vowelLetters = "аеёиоуыэюя";
  72.         // fixme: я убрал StringBuilder и сделал индексированный цикл ради строки 85
  73.         for (int j = 0; j < poem.size(); j++) {
  74.             String s = poem.get(j);
  75.             String[] words = s.split(" ");
  76.             for (String word : words) {
  77.                 int vowelCount = 0;
  78.                 for (int i = 0; i < word.length(); i++) {
  79.                     // fixme: Просто как вариант, который мне кажется слегка покороче:
  80. //                    if (vowelLetters.contains(String.valueOf(word.toLowerCase().charAt(i)))) vowelCount++;
  81.                     if (vowelLetters.contains(String.valueOf(Character.toLowerCase(word.charAt(i))))) vowelCount++;
  82.                 }
  83.                 if (vowelCount >= 3) {
  84.                     // fixme: Убрал StringBuilder. Мне кажется, что твоё решение было достойным, но оно добавляло лишние пробелы в конце каждой строки.
  85.                     // Таким образом, представь, что эти пробелы (хоть и не видны) - дополнительные символы. Это по сути меняет исходный текст, делая его больше
  86.                     s = s.replaceAll(word, word.toUpperCase());
  87.                     poem.set(j, s);
  88.                 }
  89.             }
  90.         }
  91.         // Возвращаю строку, используя Stream API
  92.         return poem.stream().collect(Collectors.joining("\n"));
  93.     }
  94.  
  95.     // todo 3) Каждое пятое слово вне зависимости от предыдущих пунктов перевести в чередующийся регистр (Начинается с верхнего, Sergey -> SeRgEy)
  96.     public static List<String> convertTextToAlternatingRegister(List<String> poem) {
  97.         List<String> result = new ArrayList<>();
  98.         int count = 1;
  99.         for (String line : poem) { //для каждого предложения
  100.             String[] wordsArray = line.split(" ");
  101.             StringBuilder convertedLine = new StringBuilder();
  102.             for (int i = 0; i < wordsArray.length; i++) { // для каждого слова
  103.                 if (count % 5 == 0) {
  104.                     wordsArray[i] = convertWord(wordsArray[i]);
  105.                 }
  106.                 count++;
  107.                 convertedLine.append(wordsArray[i]).append(" ");
  108.             }
  109.             // fixme: Хорошее решение! И как раз .trim() для отрезания лишних пробелов. Ну а так, можно и как выше (в задаче 2) руководствоваться .replace.
  110.             // В целом, отлично, но как будто с .replace подходом поприятнее - нам не нужно думать о пробелах и их удалении как в этом случае :)
  111.             result.add(convertedLine.toString().trim());
  112.         }
  113.         return result;
  114.     }
  115.  
  116.     public static String convertWord(String str) {
  117.         String result = "";
  118.         for (int i = 0; i < str.length(); i++) {
  119.             if (i % 2 == 0) result += Character.toUpperCase(str.charAt(i));
  120.             else result += str.charAt(i);
  121.         }
  122.         return result;
  123.     }
  124.  
  125.     //todo 4) Разделить стихотворение по строфам (4 строки) отступом (то есть после 4-х строк должна идти
  126.     // пустая перед продолжением последующих) и поставить точки в конце каждой строфы.
  127.  
  128.     public static List<String> divideIntoStanzas(List<String> poem) {
  129.         List<String> result = new ArrayList<>();
  130.         int count = 1;
  131.  
  132.         for (String line : poem) {
  133.             if (count % 4 == 0) {
  134.                 result.add(editLine(line));
  135.             } else result.add(line);
  136.             count++;
  137.         }
  138.         return result;
  139.     }
  140.  
  141.     public static String editLine(String line) {
  142.         // fixme: опять же, как будто однострочное решение поприятнее:
  143.         return line + ".\n";
  144. //        StringBuilder stringBuilder = new StringBuilder(line);
  145. //        return stringBuilder.append(".").append("\n").toString();
  146.     }
  147.  
  148.     // fixme: Давай я напишу пример использования Stream API для последней задачки, например.
  149.     // Насколько мы помним - всё, что связано с итерацией данных (циклами) может быть представлено в виде обработки стрима
  150.     // Да, иногда это может быть хитро и нетривиально, но в целом ради практики стоит попробовать
  151.     public static List<String> divideIntoStanzasStreamAPI(List<String> poem) {
  152.         // Здесь для удобства мы используем IntStream.range(*НАЧАЛО*, *КОНЕЦ*).
  153.         // Это позволяет нам представить индексируемый цикл и взаимодействовать с нашим индексом (i)
  154.         return IntStream.range(0, poem.size())
  155.                 .mapToObj(i -> {
  156.                     if ((i + 1) % 4 == 0) {
  157.                         return editLine(poem.get(i));
  158.                     }
  159.                     return poem.get(i);
  160.                 }).toList();
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement