簡體   English   中英

如何在讀取文件時打破Scala中的循環?

[英]How to break a loop in scala while reading a file?

我需要在Scala中讀取一些大文本文件。 並將該文件中的一行附加到StringBuilder 但是,如果該文件中的行包含一些String,則需要中斷循環。 而且我不想將該String附加到StringBuilder。 例如,在Java中,循環A將在結果字符串中包含"pengkor" 循環B不包括該String,但是在循環中有scala中不可用的break語句。 在循環C中,我使用了for語句,但是行為與scala中的for循環完全不同。 我主要關心的是不要在StringBuilder中包含"pengkor"字符串,也不要將文件的所有內容加載到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());
    }

}

一種方法是將布爾值作為循環中的條件。

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

takeWhile一種類似於Scala的方式是使用takeWhile

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

您還可以在這里查看: 如何在Scala中跳出循環? 看看處理突發事件的其他方法

您可以輕松定義函數並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))

邏輯是相反的:您無需中斷就可以調用該函數進行下一次迭代。 開銷是您需要定義一個函數並調用它。 作為優勢,您可以為循環指定一個語義名稱,在功能上傳遞參數,而不是更新變量並重用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM