OOP_IO-2x_2023-mirror/lab5/Main.java

188 lines
9.5 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import java.util.*;
public class Main {
public static void main(String[] args) {
// Ввід текста користувачем
System.out.println("Введіть текст:");
Scanner scan = new Scanner(System.in);
String inputText1 = scan.nextLine();
// Заміна табуляцій на пробіли
String inputText = inputText1.replace("\n", " ");
// Перехід від формату String до формату Text
Text text = FromStringToText(inputText);
// Зміна порядку слів в реченні
text.changeOrder();
// Вивід результату
text.printText();
}
// Метод переходу від String до Text
public static Text FromStringToText(String text) {
// Створюємо массив char з двома пробілами в кінці
char[] chars1 = text.toCharArray();
char[] chars = Arrays.copyOf(chars1, chars1.length + 2);
chars[chars.length-2]=' ';
chars[chars.length-1]=' ';
// Створюємо массив, який буде містити літери і знаки
ArrayList<Object> modifiedText = new ArrayList<>();
// Змінна, яка буде контролювати наявність знаків в тексті
int k = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '!' || chars[i] == '?' || chars[i] == '.') {
if (chars[i + 1] == '!' || chars[i + 1] == '?' || chars[i + 1] == '.') {
if (chars[i + 1 + 1] == '!' || chars[i + 1 + 1] == '?' || chars[i + 1 + 1] == '.') {
// Якщо в тексті трапляється знак, який складається відразу з трьох знаків, то програма зараховує його як один і додає в массив з літерами і знаками
ArrayList<Character> znaki = new ArrayList<>();
znaki.add(chars[i]);
znaki.add(chars[i + 1]);
znaki.add(chars[i + 1 + 1]);
Znak element = new Znak(znaki);
// Додаємо до лічильника два, щоб цикл не обробляв знаки ще раз
i = i + 1 + 1;
modifiedText.add(element);
k = k + 1;
} else {
// Якщо в тексті трапляється знак, який складається відразу з двох знаків, то програма зараховує його як один і додає в массив з літерами і знаками
ArrayList<Character> znaki = new ArrayList<>();
znaki.add(chars[i]);
znaki.add(chars[i + 1]);
Znak element = new Znak(znaki);
// Додаємо до лічильника один, щоб цикл не обробляв знаки ще раз
i = i + 1;
modifiedText.add(element);
k = k + 1;
}
} else {
// Якщо в тексті трапився один розділовий знак, то він додається до масиву з літер і знаків
ArrayList<Character> znaki = new ArrayList<>();
znaki.add(chars[i]);
Znak element = new Znak(znaki);
modifiedText.add(element);
k = k + 1;
}
} else {
// Якщо елмент массиву chars не виявився знаком, то він додається як літера
Letter element = new Letter(chars[i]);
modifiedText.add(element);
}
}
// Якщо знаків в тексті не було, програма закінчує роботу
if (k == 0) {
System.out.println("В вашому тексті нема жодного речення!");
System.exit(0);
}
// Змінна яка буде нижнею межею для зрізання слова
int l = 0;
// Масиви для створення речень і тексту відповідно
ArrayList<Word> sent = new ArrayList<Word>();
ArrayList<Sentence> tex = new ArrayList<Sentence>();
for (int i = 0; i < modifiedText.size(); i++) {
// Створюємо змінні, які містять даний елемент масиву і минулий
Object x = modifiedText.get(i);
Object x1 = new Object();
if (i > 0) {
x1 = modifiedText.get(i - 1);
}
// Перевірка чи є елемент літерою
if (x instanceof Letter) {
// Переходимо до класу Letter
Letter z = (Letter) x;
Letter y = new Letter(' ');
if (i > 0) {
y = (Letter) x1;
}
// Перевірка чи є елемент комою
if (z.isKome()) {
// Створення слова з всіх елементів, що були до коми і додавання його до речення
List<Object> wor1 = modifiedText.subList(l, i);
ArrayList<Letter> word = new ArrayList<>();
for (Object j : wor1) {
Letter let = (Letter) j;
word.add(let);
}
Word w = new Word(word);
sent.add(w);
// Зсув границі
l = i + 1;
// Додавання коми до речення
ArrayList<Letter> kome = new ArrayList<>();
kome.add(z);
Word Kome = new Word(kome);
sent.add(Kome);
}
// Перевірка чи є літера пробілом
if (z.isSpace()) {
// Перевірка чи є минулий символ комою
if (y.isKome() || y.isDash()) {
// Додавання пробілу до речення і зсув границі
ArrayList<Letter> word1 = new ArrayList<>();
word1.add(z);
Word word = new Word(word1);
sent.add(word);
l = i + 1;
} else {
// Створення слова з всіх елементів, що були до пробіла і додавання його до речення
List<Object> word1 = modifiedText.subList(l, i);
ArrayList<Letter> word = new ArrayList<>();
for (Object j : word1) {
Letter let = (Letter) j;
word.add(let);
}
Word w = new Word(word);
sent.add(w);
// Додавання пробілу до речення
ArrayList<Letter> space = new ArrayList<>();
space.add(z);
Word Space = new Word(space);
sent.add(Space);
// Зсув границі
l = i + 1;
}
}
// Перевірка чи є елемент тире
if (z.isDash()) {
if (y.isSpace()) {
// Якщо минулий елемент був пробілом, тире додається до речення
ArrayList<Letter> word1 = new ArrayList<>();
word1.add(z);
Word word = new Word(word1);
sent.add(word);
l = i + 1;
}
}
} else if (x instanceof Znak) {
// Коли елемент є знаком, то створюється речення, яке додається до тексту
List<Object> word1 = modifiedText.subList(l, i);
ArrayList<Letter> word = new ArrayList<>();
for (Object j : word1) {
Letter let = (Letter) j;
word.add(let);
}
Word w = new Word(word);
sent.add(w);
Znak z = (Znak) x;
int jump = 2;
// Зсув границі і лічильника
l = i+jump;
i = i + z.Lenght();
z.addSpace();
Sentence sentence = new Sentence(sent, z);
tex.add(sentence);
// Очищення речення
sent= new ArrayList<>();
}
}
// Створення і повернення тексту
Text text2 = new Text(tex);
text2.printText();
return text2;
}
}