Обработка строки Java

Рейтинг: -1Ответов: 1Опубликовано: 22.02.2023

Нужно было написать программу, когда слова с минимальным и максимальным количеством символов в строке меняются местами. Но потом поменялись условия, что нельзя использовать функцию Split для разделения строки на слова, а нужно использовать функции "Низкого уровня". Подскажите, как это можно сделать?

import java.util.Arrays; // Импортируем служебный класс для облегчения работы с массивом
public class HelloWorld {

public static void main (String[] args) {  //создаём массив строк
    String s = "tes te t test"; //Создаём строку
    String[] mas = s.split(" "); // С помощью метода Split делим строку на части с помощью пробела
    int maxl = mas[0].length(); // Получение максимальной длинны первого элемента
    int minl = mas[0].length(); // Получение минимальной длинны первого элемента
    String max = mas[0]; //Получаем значение максимального слова
    String min = mas[0]; //Получаем значение минимально слова
    int posmax = 0, posmin = 0; // Получение позиции максимального и минимального слова
    for (int i = 0; i<=mas.length-1; i++) { //Цикл перебора слов
        if (mas[i].length() > maxl) { //Создаём проверку - если больше максимального
            maxl = mas[i].length();// То записываем значение в максимальный элемент
            max = mas[i];
            posmax = i;
        }   else if (mas[i].length() < minl) { //Иначе если меньше минимального
            minl = mas[i].length(); //То записываем значение в минимальный элемент
            posmin = i;
            min = mas[i];
        }
    }
    mas[posmax] = min; //Меняем местами максимальный и минимальный элемент
    mas[posmin] = max;//Меняем местами максимальный и минимальный элемент
    System.out.println ("Полученная строка: ");// Выводим текстовое сообщение
    System.out.println (Arrays.toString(mas)); // Приоброзовываем массив в строку и выводим изменённую строку

Ответы

▲ 1

Для поиска слов с минимальной/максимальной длиной на низком уровне потребуется пройтись по строке, определить начальные позиции и длину минимума/максимума, обработав случаи, когда строка пустая или содержит одни пробелы, т.е не будет содержать минимума/максимума.

Фактически, потребуется только простой цикл for, методы String::charAt и String::substring, а также метод(ы) проверки символа на принадлежность "слову", типа Character::isLetter, Character::isAlphabetic, Character::isDigit и т.п. или их комбинации.

Примерная реализация:

public static String swapMinMax(String str) {
    int minLen = Integer.MAX_VALUE, minPos = 0, maxLen = -1, maxPos = 0;
    boolean inWord = false;              // флажок состояния "в слове"
    int len = 0, start = 0;
    for (int i = 0, n = str.length(); i < n; i++) {
        char c = str.charAt(i);
        if (Character.isAlphabetic(c)) { // обнаружили алфавитный символ
            if (!inWord) {
                inWord = true;
                start = i;           // запомнили начальную позицию текущего слова
            }
            if (++len > maxLen) {
                maxLen = len;        // обновили максимальную длину
                maxPos = start;      // и начало максимума
            }
        } else { // нашли символ-разделитель
            if (inWord) {
                inWord = false;      // сбросили флажок
                if (len < minLen) {
                    minLen = len;    // обновили минимальную длину
                    minPos = start;  // и начало минимума
                }
            }
            len = 0;                 // сбросили счётчик длины
        }
    }
    if (inWord && len < minLen) {    // перепроверили минимум для последнего слова
        minLen = len;
        minPos = start;
    }
    if (maxLen < 0 || minPos == maxPos) { // слово не найдено или длина минимума/максимума совпадает
        return str;
    }
    String minWord = str.substring(minPos, minPos + minLen);
    String maxWord = str.substring(maxPos, maxPos + maxLen);

    if (minPos < maxPos) // минимум слева от максимума
        return str.substring(0, minPos) + maxWord + str.substring(minPos + minLen, maxPos) + minWord + str.substring(maxPos+ maxLen);
    return str.substring(0, maxPos) + minWord + str.substring(maxPos + maxLen, minPos) + maxWord + str.substring(minPos+ minLen);
}

Тесты:

public static void main(String ... args) {
    String[] tests = {
        "", "   ", "single", "aa bb",
        "tes te t test", "tes te test t", "test te tes t", "t te tes test",
    };
    int n = 0;
    for (String t : tests) {
        System.out.printf("#%d: '%s' -> '%s'%n", ++n, t, swapMinMax(t));
    }
}

Результаты:

#1: '' -> ''
#2: '   ' -> '   '
#3: 'single' -> 'single'
#4: 'aa bb' -> 'aa bb'
#5: 'tes te t test' -> 'tes te test t'
#6: 'tes te test t' -> 'tes te t test'
#7: 'test te tes t' -> 't te tes test'
#8: 't te tes test' -> 'test te tes t'