迭代Java String的最佳方法是什么?

ala*_*inm 50 java string

目前我正在使用类似的东西:

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

我对这种方法不是很满意,因为它创建了一个沉重的数组(假设textContent可以包含一本书).

是否有更好的解决方案来迭代String

Gui*_*let 56

你可以使用:

BufferedReader bufReader = new BufferedReader(new StringReader(textContent));
Run Code Online (Sandbox Code Playgroud)

并使用readLine()方法:

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

}
Run Code Online (Sandbox Code Playgroud)


leo*_*leo 19

要将Java 8方式添加到此问题:

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

System.lineSeparator()如果您确定该文件来自与运行vm相同的平台,那么您也可以使用分割.

或者甚至更好地使用流api甚至更多agressiv与过滤器,地图和收集:

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


Nam*_*man 8

我相信从 Java-11 开始,您有一个更好的 API 可用,您可以使用String.lines()API执行相同的操作,该API 返回从由行终止符分区的字符串中提取的字符串流。

public Stream<String> lines()
Run Code Online (Sandbox Code Playgroud)

相同的用法可能是:-

Stream<String> linesFromString = textContent.lines();
linesFromString.forEach(l -> {  //do sth });
Run Code Online (Sandbox Code Playgroud)

重要的 API 说明:-

@implNote This method provides better performance than
          split("\R") by supplying elements lazily and
          by faster search of new line terminators.
Run Code Online (Sandbox Code Playgroud)


Bre*_*dan 6

你可以使用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.
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

Scanner

java.util.ScannerJava 1.5中添加的类怎么样?

综上所述:

一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串.

扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格.然后可以使用各种下一种方法将得到的标记转换成不同类型的值.

并注意您的方案:

扫描仪还可以使用除空白之外的分隔符.此示例从字符串中读取几个项目:

     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();
Run Code Online (Sandbox Code Playgroud)


Joh*_*n B 5

番石榴的分裂器效果很好.特别是你可以删除空白行

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

  • 来自guava的源代码:```Splitter.on(Pattern.compile("\ r?\n")).split(wholeFile)``` (3认同)