Java решение практических задач. Решаем задачи с Codewars
🖥 Здача Java с Codewars
Продолжаем рубрику решения практических задач на Java
Ваша задача — эмулировать выравнивание текста в моноширинном шрифте. Вам будет предоставлен однострочный текст и ожидаемая ширина выравнивания. Самое длинное слово никогда не будет больше этой ширины.
@javatg – много практики java в нашем канале.
Вот правила:
* Используйте пробелы, чтобы заполнить пробелы между словами.
* Каждая строка должна содержать как можно больше слов.
* Используйте ‘\n’ для разделения строк.
* Расстояние между словами не может отличаться более чем на один пробел.
* Строки должны заканчиваться словом, а не пробелом.
* ‘\n’ не включается в длину строки.
* Сначала идут большие пробелы, затем меньшие (“Lorem–ipsum–dolor–sit-amet” (2, 2, 2, 1 пробел)).
* Последняя строка не должна быть выравнена по ширине, используйте только один пробел между словами.
* Последняя строка не должна содержать ‘\n’
* В строках с одним словом пробелы не нужны (‘somelongword\n’).
Решение:
public class TextJustificatory {
public static String justify(String text, int width) {
final String[] source = text.split(" ");
StringBuilder result = new StringBuilder();
StringBuilder string = new StringBuilder();
for (String word : source) {
if (word.length() + string.length() + 1 > width) {
result.append(
addJustified(string, width)
)
.append("\n");
string
.delete(0, string.length());
}
if (string.length() != 0) string.append(" ");
string.append(word);
}
result.append(
string
);
return result.toString();
}
private static String addJustified(StringBuilder raw, int width) {
final String[] words = raw.toString().split(" ");
if (words.length == 0) return "";
if (words.length == 1) return words[0];
final int freeSpaces = width - raw.length();
final int additionalSpacesPerWord = freeSpaces / (words.length - 1);
final int additionalSpacesForFirstWords = freeSpaces % (words.length - 1);
StringBuilder result = new StringBuilder(words[0]);
for (int i = 1; i < words.length; i++) {
result.append(" ");
if (i <= additionalSpacesForFirstWords) result.append(" ");
for (int i1 = 0; i1 < additionalSpacesPerWord; i1++) {
result.append(" ");
}
if (i != words.length - 1) result.append(words[i]);
}
result.append(words[words.length - 1]);
return result.toString();
}
}
Пишите ваши варианты решений в комментариях