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

Moh*_*jar 1 java loops scala list

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

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

}
Run Code Online (Sandbox Code Playgroud)

Kig*_*gyo 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
Run Code Online (Sandbox Code Playgroud)

还有一种类似scala的方式就是使用takeWhile.

val lines = Source.fromPath("myfile.txt").getLines()
val builder = new StringBuilder
lines.takeWhile(_ != "pengkor").foreach(builder ++= _)
Run Code Online (Sandbox Code Playgroud)

您还可以看一下:如何在Scala中打破循环?看看摆脱循环的其他方法

  • 3)使用递归,很像第一种方式 (2认同)