Подтвердить что ты не робот

Каков наилучший способ перебора строк строки Java?

В настоящее время я использую что-то вроде:

String[]lines = textContent.split(System.getProperty("line.separator"));
for(String tmpLine : lines){
   //do something
}

Я не очень доволен этим методом, потому что он создает тяжелый массив (пусть textContent может содержать книгу).

Есть ли лучшее решение для итерации по строкам String?

4b9b3361

Ответ 1

Вы можете использовать:

BufferedReader bufReader = new BufferedReader(new StringReader(textContent));

И используйте метод readLine():

String line=null;
while( (line=bufReader.readLine()) != null )
{

}

Ответ 2

Чтобы добавить способ Java 8 к этому вопросу:

Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)

Из проклятия вы также можете использовать System.lineSeparator() для разделения, если вы уверены, что файл отправляется из той же формы, что и vm.

Или даже лучше использовать поток api еще более агрессивно с фильтром, отобразить и собрать:

String result = Arrays.stream(content.split(System.lineSeparator()))
                     .filter(/* filter for lines you are interested in*/)
                     .map(/*convert string*/)
                     .collect(Collectors.joining(";"));

Ответ 3

Вы можете использовать String.indexOf()/String.substring()

String separator = System.getProperty("line.separator");
int index = textContent.indexOf(separator);

while (index > 0)
{
  int nextIndex = textContent.indexOf(separator, index + separator.length());
  String line = textContent.substring(index + separator.length(), nextIndex);

  // do something with line.
}

Ответ 4

Guava Splitter работает хорошо. Тем более, что вы можете удалить пустые строки

Splitter splitter = Splitter.on(System.getProperty("line.separator"))
                            .trimResults()
                            .omitEmptyStrings();
for (String line : splitter.split(input)){
   // do work here
}

Ответ 5

Как насчет класса java.util.Scanner?

Вкратце:

Простой текстовый сканер, который может анализировать примитивные типы и строки используя регулярные выражения.

Сканер разбивает свой вход на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу. В результате токены могут быть преобразуются в значения разных типов, используя различные следующие Методы.

и примечания для вашего сценария:

Сканер также может использовать разделители, отличные от пробелов. Эта пример читает несколько элементов из строки:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close();

Ответ 6

используйте BufferedReader с аргументом StringReader. BufferedReader имеет метод readLine(), чтобы вы могли читать строку за строкой.

    StringReader reader = new StringReader(myBigTextString);
    BufferedReader br = new BufferedReader(reader);
    String line;
    while((line=br.readLine())!=null)
    {
        //do what you want
    }

Ответ 7

Объединить java.io.StringReader и java.io.LineNumberReader

Ответ 8

На самом деле вы можете прервать Scanner, чтобы вы могли использовать обычный цикл for:

import java.util.Scanner;
public class IterateLines {
    public static void main(String[] args) {
        Iterable<String> sc = () ->
            new Scanner("foo bar\nbaz\n").useDelimiter("\n");
        for (String line: sc) {
            System.out.println(line);
        }
    }
}

дает нам:

$ javac IterateLines.java && java IterateLines 
foo bar
baz