2016-02-28 49 views
1

假設我們試圖在一個類中找到一些字符串,並假設該類有這個字符串重複多次。如何使.contains()方法在找到第一個匹配項時停止?這裏是我的意思的例子:如何在類中找到第一個匹配時停止方法.contains()?

 for (File f : list) { 
     if (f.isDirectory()) { 
      walk(f.getAbsolutePath()); 
     } 

     if (f.getName().endsWith(".java")) { 

      System.out.println("File:" + f.getName()); 
      countFiles++; 

      Scanner sc2 = new Scanner(f); 

      while (sc2.hasNextLine()) { 

       count++; 

       String str = sc2.nextLine(); 

       if (str.contains("@Test")) { 
        System.out.println("this is a test class"); 

       } 

正如你可以看到,我試圖找到測試類,所以我在尋找@Test符號,程序可以正常使用,但在這種情況下,其打印(這是一個測試課)幾次,因爲我正在測試的課程有四個@Test符號!

謝謝!

+0

也許使用'break',參見[Branching Statements:break語句](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html) – MadProgrammer

回答

1

我會建議break語句,以及:

break; 

break語句將退出最內層循環。 continue語句將跳過該循環中的其餘代碼,並且由於循環以print語句結束,循環結尾處的continue語句將不會執行任何操作。

它看起來像你有一個for循環在每個文檔,然後將文檔中的每一行while循環,你的代碼是在哪裏找到你的字符串中的每個文檔返回每一行。

如果你把一個break語句print語句後,將打印一個行那裏找到你的文本的每個文件。

如果你想它的第一個文件後停下來,你就需要創建一個標誌像

boolean found = False; 

,然後把這個if語句內的打印

found = True; 
break; 

下方然後,在while循環的最後補充一點:

if(found){break;} 

當你的程序發現日的第一個實例e字符串會將標誌設置爲true並退出while循環,然後由於該標誌設置爲true,它將退出for循環並在打印第一個實例後結束。

+0

您的解決方案有效,謝謝! – user5923402

1

你需要一個label

nextFile: //add this label 
for (File f : list) { 
    if (f.isDirectory()) { 
     walk(f.getAbsolutePath()); 
    } 

    if (f.getName().endsWith(".java")) { 

     System.out.println("File:" + f.getName()); 
     countFiles++; 

     Scanner sc2 = new Scanner(f); 

     while (sc2.hasNextLine()) { 

      count++; 

      String str = sc2.nextLine(); 

      if (str.contains("@Test")) { 
       System.out.println("this is a test class"); 
       continue nextFile;//go for next file 
      } 

編輯

以防萬一你要退出的方法,我想返回類型爲void;

if (str.contains("@Test")) { 
    System.out.println("this is a test class"); 
    return; //quit method 
} 
+0

在他的上下文中'for'循環,標籤將是多餘的。 – Ellis

+0

@ em1382,簡單地使用'continue'關鍵字只會影響封閉的while循環而不是最上面的for循環。因此添加了'label'。 – Arvind

+0

啊,錯過了。抱歉。 – Ellis

1

breakcontinue是危險的。很容易忘記你正在編寫哪一個塊,或者是如何在編輯功能時添加/編輯功能。這導致了微妙的,痛苦的錯誤。

我會建議不同的方法,一個更OO:分離出一個返回File是否是一個測試文件或不是一個方法:

for (File f : list) { 
    if (f.isDirectory()) { 
     walk(f.getAbsolutePath()); 
    } 

    if (f.getName().endsWith(".java")) { 

     System.out.println("File:" + f.getName()); 
     countFiles++; 

     if (isTestFile(f)) { 
      System.out.println("this is a test class"); 
     } 

的實施將包含您的掃描代碼,並返回上第一次打擊:

private boolean isTestFile(File file) { 
    Scanner scanner = new Scanner(f); 

    while (scanner.hasNextLine()) { 
     if (scanner.nextLine().contains("@Test")) { 
      return true; 
     } 
    } 
    return false; 
} 

這也是一個更清晰的意圖聲明,因爲它解釋了您試圖在方法名稱中實現的內容。它還提供了將實現從意圖中分離出來的額外好處 - 如果不行,您會想到更好的方法來識別測試類,您更改了方法體,並且其餘代碼都不必更改。

相關問題