迭代Javastring的最佳方法是什么?
目前我正在使用类似于:
String[]lines = textContent.split(System.getProperty("line.separator")); for(String tmpLine : lines){ //do something }
我不是很高兴这种方法,因为它创build了一个沉重的数组(让我们说textContent
可以包含一本书)。
有没有更好的解决scheme来遍历一个String
的行?
你可以使用:
BufferedReader bufReader = new BufferedReader(new StringReader(textContent));
并使用readLine()
方法:
String line=null; while( (line=bufReader.readLine()) != null ) { }
要添加Java 8的方式来解决这个问题:
Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)
诅咒你也可以使用System.lineSeparator()
来分割,如果你确定文件是从同一个平台上运行的。
或者更好的使用streamapi更加agressiv与filter,地图和收集:
String result = Arrays.stream(content.split(System.lineSeparator())) .filter(/* filter for lines you are interested in*/) .map(/*convert string*/) .collect(Collectors.joining(";"));
你可以使用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. }
番石榴的Splitter运作良好。 特别是你可以删除空行
Splitter splitter = Splitter.on(System.getProperty("line.separator")) .trimResults() .omitEmptyStrings(); for (String line : splitter.split(input)){ // do work here }
那么java.util.Scanner
类呢?
综上所述:
一个简单的文本扫描器,可以使用正则expression式分析原始types和string。
扫描器使用分隔符模式将input分为令牌,缺省情况下符合空格。 然后可以使用各种下一种方法将得到的令牌转换为不同types的值。
并注意你的情况:
扫描仪也可以使用除空格之外的分隔符。 这个例子从一个string中读取几个项目:
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();
使用带有StringReader参数的BufferedReader。 BufferedReader有一个方法readLine(),所以你可以逐行读取你的string。
StringReader reader = new StringReader(myBigTextString); BufferedReader br = new BufferedReader(reader); String line; while((line=br.readLine())!=null) { //do what you want }
组合java.io.StringReader
和java.io.LineNumberReader
实际上,您可以使用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