如何在类中找到第一个匹配时停止方法.contains()?

时间:2016-02-28 23:22:09

标签: java 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符号!

谢谢!

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

我也会推荐break语句:

break;

break语句将退出最内层循环。 continue语句将跳过该循环中的其余代码,并且由于循环以print语句结束,循环结束时的continue语句将不执行任何操作。

看起来你在每个文档上都有一个for循环,然后在文档中的每一行都有一个while循环,你的代码返回每个文档中找到你的字符串的每一行。

如果在print语句之后放置一个break语句,它将为每个找到文本的文件打印一行。

如果您希望在第一个文件后停止,则需要创建一个标记

boolean found = False;

然后把它放在print

下面的if语句中
found = True;
break;

然后在while循环结束时添加:

if(found){break;}

当你的程序找到字符串的第一个实例时,它会将标志设置为true并退出while循环,然后由于该标志设置为true,它将退出for循环并在仅打印第一个实例后完成。

答案 2 :(得分:1)

breakcontinue很危险。很容易忘记您break {{}}或continue出来的阻止,特别是在线下添加/编辑功能时。这导致了微妙,痛苦的错误。

我会建议一个不同的方法,一个更多的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;
}

这也是一个更明确的意图声明,因为它解释了您在方法名称中尝试实现的目标。它还提供了将实现与意图分离的额外好处 - 如果在线下,您会想到一种更好的方法来识别测试类,您可以更改isTestFile()方法体,而不是其他任何代码必须改变。