Ответ 1
Apache commons содержит WordUtils и функцию обтекания:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html
PS Похоже, это dericric и вам нужно использовать
вместо.
Прежде чем я заново изобрету колесо (плохо), я хотел бы знать, существует ли какой-то существующий Java-код для обертывания текстовых строк с заданной максимальной шириной. В идеале это было бы:
Изменить: здесь нет "пикселей", только java.lang.String. "Максимальная ширина" относится к числу символов в строке.
Apache commons содержит WordUtils и функцию обтекания:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html
PS Похоже, это dericric и вам нужно использовать
вместо.
Вот мой дубль
private static final String LINEBREAK = "\n"; // or "\r\n";
public static String wrap(String string, int lineLength) {
StringBuilder b = new StringBuilder();
for (String line : string.split(Pattern.quote(LINEBREAK))) {
b.append(wrapLine(line, lineLength));
}
return b.toString();
}
private static String wrapLine(String line, int lineLength) {
if (line.length() == 0) return LINEBREAK;
if (line.length() <= lineLength) return line + LINEBREAK;
String[] words = line.split(" ");
StringBuilder allLines = new StringBuilder();
StringBuilder trimmedLine = new StringBuilder();
for (String word : words) {
if (trimmedLine.length() + 1 + word.length() <= lineLength) {
trimmedLine.append(word).append(" ");
} else {
allLines.append(trimmedLine).append(LINEBREAK);
trimmedLine = new StringBuilder();
trimmedLine.append(word).append(" ");
}
}
if (trimmedLine.length() > 0) {
allLines.append(trimmedLine);
}
allLines.append(linebreak);
return allLines.toString();
}
(Это решение убирает два пробела в один пробел (такая же ошибка, что и у @jett с Apache commons WordUtils)).
Используйте библиотеку переноса слов (доступно в Maven Central).
Вот один из способов его использования:
String text = "hello how are you going?";
String wrapped =
WordWrap.from(text)
.maxWidth(10)
.insertHyphens(true) // true is the default
.wrap();
Выход:
hi there
how are
you going?
Библиотека сохраняет начальные пробелы в строках, что является одной из жалоб на поведение предложения Apache commons-lang. Вы также можете указать функцию stringWidth
для получения точных результатов при рендеринге текста.
Библиотека имеет достойный охват модульных тестов (что следует иметь в виду, когда вы рассматриваете копирование и вставку фрагментов кода из Интернета!).
Зависимость Maven это:
<dependency>
<groupId>com.github.davidmoten</groupId>
<artifactId>word-wrap</artifactId>
<version>0.1.1</version>
</dependency>
Не забудьте проверить на более позднюю версию.
То, что вы хотите сделать, будет работать только при отображении результатов шрифтом с фиксированной шириной. В противном случае количество символов в строке не будет одинаковым от строки к строке. Если с тобой все в порядке, я бы сказал, что ваш вопрос довольно необычный (особенно учитывая перенос слов), поэтому я сомневаюсь, что вы найдете готовые решения.
Если вы пытаетесь отформатировать какую-то документацию, также существует старое семейство команд unix roff (или runoff). Вам просто нужно вставить команды форматирования и позволить roff делать тяжелый подъем.
public static List<String> stringBreak(String string, int maxChar) {
List<String> subLines = new ArrayList<String>();
int length = string.length();
int start = 0;
int end = maxChar;
if (length > maxChar) {
int noOfLines = (length / maxChar) + 1;
int endOfStr[] = new int[noOfLines];
for (int f = 0; f < noOfLines - 1; f++) {
int end1 = maxChar;
endOfStr[f] = end;
if (string.charAt(end - 1) != ' ') {
if (string.charAt(end - 2) == ' ') {
subLines.add(string.substring(start, end - 1));
start = end - 1;
end = end - 1 + end1;
} else if (string.charAt(end - 2) != ' '
&& string.charAt(end) == ' ') {
subLines.add(string.substring(start, end));
start = end;
end = end + end1;
} else if (string.charAt(end - 2) != ' ') {
subLines.add(string.substring(start, end) + "-");
start = end;
end = end + end1;
} else if (string.charAt(end + 2) == ' ') {
System.out.println("m here ............");
int lastSpaceIndex = string.substring(start, end)
.lastIndexOf("");
subLines.add(string.substring(start, lastSpaceIndex));
start = lastSpaceIndex;
end = lastSpaceIndex + end1;
}
} else {
subLines.add(string.substring(start, end));
start = end;
end = end + end1;
}
}
subLines.add(string.substring(endOfStr[noOfLines - 2], length));
}
return subLines;
}