Обработка строки Java
Нужно было написать программу, когда слова с минимальным и максимальным количеством символов в строке меняются местами. Но потом поменялись условия, что нельзя использовать функцию 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'