Java-код для переноса текстовых строк до максимальной ширины строки - PullRequest
19 голосов
/ 29 октября 2010

Прежде чем я заново изобрел колесо (плохо), я хотел бы знать, существует ли какой-нибудь существующий Java-код для переноса текстовых строк до заданной максимальной ширины.В идеале:

  • учитывает существующие разрывы строк
  • разбивает строки, превышающие максимальную длину на границах слов
  • разбивает слова, длина которых превышает максимальную ширину строки навставка дефисов

Редактировать: здесь нет "пикселей", только java.lang.String.«максимальная ширина» относится к числу символов в строке.

Ответы [ 6 ]

24 голосов
/ 30 октября 2010

Apache commons имеет WordUtils и функцию обтекания:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html

PS Похоже, это ограничено, и вам нужно использовать

https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/WordUtils.html

вместо.

1 голос
/ 06 июля 2018

Используйте библиотеку word-wrap (доступна в 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, чтобы получать точные пиксельные результаты при рендеринге текста.

В библиотеке имеется достойное покрытие модульных тестов (что следует иметь в виду, когда вы рассматриваете копирование и вставку фрагментов кода изweb!).

Зависимость Maven:

<dependency>
  <groupId>com.github.davidmoten</groupId>
  <artifactId>word-wrap</artifactId>
  <version>0.1.1</version>
</dependency>

Обязательно проверьте более позднюю версию.

1 голос
/ 10 августа 2017

Вот мое взятие

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 WordUtils)).

0 голосов
/ 13 июня 2013
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;
}
0 голосов
/ 30 октября 2010

Если вы пытаетесь отформатировать какую-либо документацию, есть также старое семейство команд unix roff (или runoff).Вам просто нужно вставить команды форматирования и позволить roff сделать тяжелую работу.

0 голосов
/ 30 октября 2010

То, что вы хотите сделать, сработает, только если вы отобразите результаты шрифтом фиксированной ширины. В противном случае количество символов в строке не будет одинаковым от строки к строке. Если вас это устраивает, я бы сказал, что это довольно необычный случай (особенно с учетом переносов), поэтому я сомневаюсь, что вы найдете готовые решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...