假设我们试图在类中找到一些字符串,并假设该类重复多次该字符串。如何在.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 :(得分: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)
break
和continue
很危险。很容易忘记您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()
方法体,而不是其他任何代码必须改变。