Как читать String Builder по строкам

Могу ли я читать String Builder по строкам? И получите длину каждой строки.


EDIT:

"Я строю строку в StringBuilder и добавляю" \n "внутри. И мне нужно ее снова прочитать. Мне нужно учитывать, что каждая" \n "имеет новую строку."

Ответ 1

Учитывая ваше редактирование, это так же просто, как вызвать toString() в экземпляре StringBuilder, а затем вызвать split("\\n") в возвращаемом экземпляре String. И оттуда у вас будет массив String, который вы можете пропустить, чтобы получить доступ к каждой "строке" экземпляра StringBuilder. И, конечно, вызовите length() для каждого экземпляра String или "строки", чтобы получить его длину.


StringBuilder sb = new StringBuilder();
sb.append("line 1");
sb.append("\\n");
sb.append("line 2");

String[] lines = sb.toString().split("\\n");
for(String s: lines){
    System.out.println("Content = " + s);
    System.out.println("Length = " + s.length());
}

Ответ 2

Создайте объект Scanner, и там вы можете легко разобрать строку для строки и получить длину.

Scanner scan = new Scanner(sb.toString()); // I have named your StringBuilder object sb
while (scan.hasNextLine() ){
 String oneLine = scan.nextLine();
 System.out.println(oneLine.length());
}

Ответ 3

Не уверен, что вы пытаетесь сделать, но вы можете вызвать toString().split(), чтобы получить массив. Вы можете разделить на разделители строк.

Ответ 4

Я думаю, что нет метода для чтения строковых построек по строкам. но если вы хотите отделить целую строку за строкой, вы можете добавить символ новой строки "\n" " при добавлении строки в StringBuilder.

Ответ 5

Использовать ( "\n" );, когда вы добавляете к stringbuilder. Это простой способ сделать.

Ответ 6

Как уже было сказано, в простом случае вы можете просто использовать toString().split(). Если вы хотите что-то более гибкое и которое также поддерживает удаление линии, довольно просто выполнить итерацию по строкам, просто отслеживая начальные и конечные значения последней строки, которую вы вернули:

    new Iterator<String>() {
      boolean hasNext = true;
      boolean removed = false;
      int start = 0;
      int end = -1;
      @Override public boolean hasNext() {
        return hasNext;
      }

      @Override public String next() {
        removed = false;
        if (!hasNext) {
          throw new NoSuchElementException();
        }
        start = end + 1;
        end = value.indexOf("\n", start);
        if (end == -1) {
          hasNext = false;
        }
        return value.substring(
            start,
            end == -1 ? value.length() : end);
      }

      @Override public void remove() {
        if (removed) {
          throw new IllegalStateException("Multiple calls to remove() without and intervening call to next().");
        }
        value.delete(
            start,
            end == -1 ? value.length() : end + 1);
        end = start - 1;
        removed = true;
      }
    };

Вы можете увидеть это в классе утилиты, который возвращает LineIterator для String или StringBuilder здесь: http://pastebin.com/JA6abTg3

И у него есть тесты, которые показывают, как это можно использовать здесь: http://pastebin.com/X1b5cGX8