У меня есть задача: Осуществить форматирование заданного текста с выравниванием по левому краю. Программа должна разбивать текст на строки с длиной, не превосходящей заданного количества символов. Если очередное слово не помещается в текущей строке, его необходимо переносить на следующую.
Код следующий:
public class Main {
public static void main(String[] args) {
String text = "A web browser is a software on your computer used to request and display web pages from the internet. " +
"The most common are Google Chrome, Mozilla Firefox, Microsoft Internet Explorer and Apple Safari.";
Formatter formatter = new Formatter();
formatter.format("", text);
System.out.print(formatter);
}
}
подскажите, какие параметры передать в пустые кавычки?
public static String justifyText(String text, int maxChars) {
StringBuilder sb = new StringBuilder();
// collect words from text with maxChars (80) justification
// .....
return sb.toString();
}
Реализация - не очень сложная. Студент 1-курса осилит.
public static String getJustifiedText(String text, int maxChars) {
String[] words = text.split(" "); // 35
StringBuilder justifiedText = new StringBuilder();
int currentChars = 0;
for (String word : words) {
currentChars += word.length() + 1;
if (currentChars > maxChars) {
justifiedText.append("\n");
currentChars = word.length() + 1;
}
justifiedText.append(word).append(" ");
}
return justifiedText.toString().trim();
}
теперь моя задача состоит в следующем, и тут точно нет вариантов:
"Изменить программу из предыдущего примера так, чтобы она осуществляла форматирование с выравниванием по обоим краям. Для этого добавить дополнительные пробелы между словами."
Подскажите, пожалуйста.
Darya Boo, основной каркас остается - тот-же самый.
Только при накоплении строки мы слова пишем не в StringBuilder а в коллекцию слов.
Когда достигаем условия maxChars - добиваем коллекцию пробелами между слов
до тех пор пока не достигнем ТОЧНОГО размера maxChars.
Более элегантное решение на расчете пробелов через деление и остаток от деления но я-бы
его не далал т.к. добивание пробелами - вполне себе годное решение. И быстрое. Разница
в перформансе почти не будет заметна.
Кнопки "сделать хорошо" в Java нет (ну, иногда есть, но не в этот раз)
Я вижу следующий путь:
- разбиваешь исходную строку на слова, помещая их в массив (см. методы класса String);
- создаёшь новую строку (лучше StringBuilder);
- идёшь по массиву, добавляя слова в новую строку, подсчитывая кол-во добавленных символов;
- если новое слово не помещается, вставляешь "перенос строки", обнуляешь счётчик и продолжаешь добавлять слова;
public static String getJustifiedText(String text, int maxChars) {
String[] words = text.split(" "); // 35
StringBuilder justifiedText = new StringBuilder();
int currentChars = 0;
for (String word : words) {
currentChars += word.length() + 1;
if (currentChars > maxChars) {
justifiedText.append("\n");
currentChars = word.length() + 1;
}
justifiedText.append(word).append(" ");
}
return justifiedText.toString().trim();
}
теперь моя задача состоит в следующем, и тут точно нет вариантов:
"Изменить программу из предыдущего примера так, чтобы она осуществляла форматирование с выравниванием по обоим краям. Для этого добавить дополнительные пробелы между словами."
Подскажите, пожалуйста.
Darya Boo, здесь было бы удобнее чтобы каждая строка текста была представлена отдельным String, а все вместе они составляли коллекцию List. Вместо добавления '\n' вносим набранную строку в List и заводим новую.
Далее идём по строкам, смотрим их длину, понимаем сколько пробелов надо добавить. Смотрим какие методы есть у String касаемо поиска и замены подстрок (надо заменить "пробел" на "два_пробела" начиная с определённой позиции).
Второе выравнивание можно сделать в отдельном цикле, а можно в том же, но тогда эту логику лучше вынести в отдельный метод: так ты сможешь протестировать его отдельно и сам код будет более читаем.
Тут есть нюанс, но ты с ним разберёшься когда будешь тестировать :)
Darya Boo, Когда ты пишешь код, ты его периодически запускаешь и проверяешь как он работает, подсовывая ему разные данные, проверяя нормальные условия и какие-нибудь ненормальные:
- а что если придёт пустая строка?
- а что если придёт вообще null?
- а что если...........?
@Test ты пишешь когда приложение уже более-менее готово и эти тесты должны выполниться автоматически при сборке приложения, т.е. если какой-то тест не прошёл - приложение не соберётся.
Иногда наоборот - сначала пишут тесты, а потом сами "рабочие" классы. Но это когда приложение сначала спроектировано, т.е. заранее определена структура приложения, иерархия классов и функции каждого элемента.
Тема автоматизированного тестирования - это отдельная наука, даже есть профессия - тестировщик. Хотя программисты этим тоже немного владеют :)
Wan-Derer прикол в том, что учусь я именно на автоматизатора
И мой брат, мой ментор, проверяет мои задания, и говорит, что логика у меня так себе…)
Но, я стараюсь мыслить разнообразно. Спасибо вам большое за обратную связь.