如何在读取文件时打破scala中的循环?

时间:2014-03-29 08:45:26

标签: java list scala loops

我需要在scala中阅读一些大文本文件。并在该文件中添加一行StringBuilder。但是如果该文件中的行包含一些String,我需要打破循环。而且我不想将String附加到StringBuilder。例如,在java中,循环A将在结果字符串中包含"pengkor"。循环B不包括该String,但在循环中有break语句在scala中不可用。在循环C中,我使用了for语句,但行为与scala中的for循环非常不同。我主要关注的是不要在StringBuilder中包含"pengkor"字符串,而不是将文件的所有内容加载到Scala列表中(出于scala中列表理解或其他一些列表操作的目的),因为文件的大小。 / p>

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());
    }

}

2 个答案:

答案 0 :(得分:5)

执行此操作的一种方法是使用布尔值作为循环中的条件。

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?看看其他方法来摆脱循环

答案 1 :(得分:0)

您可以轻松定义一个功能,continue而非破坏

@tailrec
def continue(buf: Array[Byte]) {
    val read = in.read(buf); 
    if (read != -1) {
        sb.append(parse(buf, read))
        continue(buf); // recur
    } 
    // else do not recur = break the loop
} 
continue(Array.fill(1)(0))

逻辑反转:您可以调用该函数进行下一次迭代,而不是中断。开销是你需要定义一个函数并调用它。作为一个优点,您可以为循环提供语义名称,在功能上传递参数而不是更新变量并重用循环。