我需要在 scala 中读取一些大文本文件。并将该文件中的一行附加到 StringBuilder
。但是如果该文件中的行包含一些字符串,我需要打破循环。而且我不想将该字符串附加到 StringBuilder。例如在 java 中,循环 A
将在结果字符串中包含 "pengkor"
。循环 B
不包括该字符串,但在循环中有 break
语句,这在 scala 中不可用。在循环 C 中,我使用了 for
语句,但其行为与 Scala 中的 for
循环非常不同。我主要关心的是不要在 StringBuilder 中包含 "pengkor"
String 并且不要将文件的所有内容加载到 Scala 列表(为了在 Scala 中进行列表理解或其他一些列表操作),因为文件大小。
public class TestDoWhile {
public static void main(String[] args) {
String s[] = {"makin", "manyun", "mama", "mabuk", "pengkor", "subtitle"};
String m = "";
StringBuilder builder = new StringBuilder();
// loop A
int a = 0;
while (!m.equals("pengkor")) {
m = s[a];
builder.append(m);
a++;
}
System.out.println(builder.toString());
// loop B
a = 0;
builder = new StringBuilder();
while (a < s.length) {
m = s[a];
if (!m.equals("pengkor")) {
builder.append(m);
} else {
break;
}
a++;
}
System.out.println(builder.toString());
// loop C
builder = new StringBuilder();
a = 0;
for (m = ""; !m.equals("pengkor"); m = s[a], a++) {
builder.append(m);
}
System.out.println(builder.toString());
}
}
最佳答案
执行此操作的一种方法是使用 boolean 值作为循环中的条件。
val lines = Source.fromPath("myfile.txt").getLines()
val builder = new StringBuilder
var cond = true
while(lines.hasNext && cond) {
val line = lines.next
if(line != "pengkor") {
builder ++= line
} else cond = false
}
//.. do something with the builder
另一种类似 scala 的方法是使用 takeWhile
。
val lines = Source.fromPath("myfile.txt").getLines()
val builder = new StringBuilder
lines.takeWhile(_ != "pengkor").foreach(builder ++= _)
您也可以在这里查看:How do I break out of a loop in Scala?查看处理循环中断的其他方法
关于java - 如何在读取文件时打破 Scala 中的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22728929/