groovy 两个foreach嵌套循环
时间: 2023-07-08 10:40:42 浏览: 217
你可以使用下面的代码来嵌套两个 foreach 循环:
```
def list1 = [1, 2, 3]
def list2 = ['a', 'b', 'c']
list1.each { num ->
list2.each { letter ->
println("$num$letter")
}
}
```
这个代码会输出以下内容:
```
1a
1b
1c
2a
2b
2c
3a
3b
3c
```
这里使用了两个列表,内部嵌套了两个 foreach 循环。外部的 foreach 循环遍历 list1 列表的每个元素,内部的 foreach 循环遍历 list2 列表的每个元素。在内部循环中,将 num 和 letter 组合起来并打印输出。
相关问题
Katalon8.6.0中写一个Groovy脚本实现:利用java-diff-utils,实现自动化比较两个文件夹下的同名文件:如果文件只在一个文件夹中存在,将信息输出到result文件中;如果两个文件夹都存在,则将两个文件的比较结果和差异数据输出到result文件中。要求减少嵌套循环,且每次执行都重新生成result文件
好的,我知道你的要求了,以下是实现该功能的Groovy脚本:
```groovy
@Grab(group='com.googlecode.java-diff-utils', module='diffutils', version='1.3.0')
import difflib.*
import java.nio.file.*
import java.nio.charset.*
// 定义两个文件夹的路径
def folder1 = Paths.get("path/to/folder1")
def folder2 = Paths.get("path/to/folder2")
// 定义结果输出文件的路径
def resultFile = Paths.get("path/to/result/file.txt")
// 删除原有的结果输出文件
Files.deleteIfExists(resultFile)
// 遍历文件夹1中的所有文件
Files.walk(folder1).filter { Files.isRegularFile(it) }.forEach { file1 ->
def file2 = folder2.resolve(file1.relativize(folder1))
if (Files.exists(file2)) {
// 如果两个文件夹都存在同名文件,则比较文件内容
def lines1 = Files.readAllLines(file1, StandardCharsets.UTF_8)
def lines2 = Files.readAllLines(file2, StandardCharsets.UTF_8)
def patch = DiffUtils.diff(lines1, lines2)
if (!patch.getDeltas().isEmpty()) {
// 如果两个文件内容不同,则将比较结果和差异数据输出到结果文件中
Files.write(resultFile, "File ${file1.getFileName()}:\n", StandardOpenOption.APPEND, StandardOpenOption.CREATE)
patch.getDeltas().each { delta ->
Files.write(resultFile, "${delta.getType()} delta between lines ${delta.getOriginal().getPosition()+1} and ${delta.getOriginal().last()+1}:\n", StandardOpenOption.APPEND)
delta.getOriginal().getLines().each { line ->
Files.write(resultFile, "< $line\n", StandardOpenOption.APPEND)
}
delta.getRevised().getLines().each { line ->
Files.write(resultFile, "> $line\n", StandardOpenOption.APPEND)
}
}
}
} else {
// 如果文件只在一个文件夹中存在,则将信息输出到结果文件中
Files.write(resultFile, "File ${file1.getFileName()} only exists in folder1.\n", StandardOpenOption.APPEND, StandardOpenOption.CREATE)
}
}
Files.walk(folder2).filter { Files.isRegularFile(it) }.forEach { file2 ->
def file1 = folder1.resolve(file2.relativize(folder2))
if (!Files.exists(file1)) {
// 如果文件只在一个文件夹中存在,则将信息输出到结果文件中
Files.write(resultFile, "File ${file2.getFileName()} only exists in folder2.\n", StandardOpenOption.APPEND, StandardOpenOption.CREATE)
}
}
```
该脚本使用Java的`java.nio.file`包遍历指定的两个文件夹中的所有文件,并分别对同名文件进行比较。如果文件内容相同,则跳过;如果文件内容不同,则将比较结果和差异数据输出到指定的结果输出文件中。如果某个文件只在一个文件夹中存在,则将信息输出到结果文件中。
同时,该脚本使用了Java的`java-diff-utils`库来实现文件内容的比较,避免了嵌套循环的问题。另外,每次执行时都会删除原有的结果输出文件,并重新生成一个新的结果输出文件。
Katalon的Groovy脚本实现:利用java-diff-utils,实现自动化比较两个文件夹下的同名文件:如果文件只在一个文件夹中存在,将信息输出到result文件中;如果两个文件夹都存在,则将两个文件的比较结果和差异数据输出到result文件中。要求减少嵌套循环,且每次执行都重新生成result文件
好的,我明白了您的问题。首先需要安装java-diff-utils库,可以使用以下命令:
```
groovysh -classpath path/to/java-diff-utils.jar
```
接着就可以编写Katalon的Groovy脚本来实现您的要求,可以参考以下示例代码:
```groovy
import difflib.*
import java.nio.file.*
def dir1 = Paths.get("path/to/directory1")
def dir2 = Paths.get("path/to/directory2")
def resultFile = Paths.get("path/to/resultFile")
// 如果result文件已存在,则删除
if (Files.exists(resultFile)) {
Files.delete(resultFile)
}
// 遍历dir1中的文件
Files.list(dir1)
.filter { Files.isRegularFile(it) }
.forEach { file1 ->
def file2 = dir2.resolve(file1.getFileName())
if (Files.notExists(file2)) {
// 如果dir2中不存在同名文件,则输出信息到result文件
Files.write(resultFile, "File ${file1.getFileName()} only exists in directory ${dir1.getFileName()}\n".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND)
} else {
// 如果dir2中存在同名文件,则比较差异并输出到result文件
def lines1 = Files.readAllLines(file1)
def lines2 = Files.readAllLines(file2)
def patch = DiffUtils.diff(lines1, lines2)
def diff = patch.getDeltas().collect { delta ->
def lines = delta.getOriginal().getLines().collect { "- " + it }
lines.addAll(delta.getRevised().getLines().collect { "+ " + it })
lines.join("\n")
}.join("\n")
Files.write(resultFile, "Diff for file ${file1.getFileName()}:\n${diff}\n".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND)
}
}
```
这段代码会遍历两个目录下的同名文件,如果只存在于其中一个目录,则输出信息到result文件;如果两个目录都存在,则比较差异并输出到result文件。其中使用了java-diff-utils库来实现文件差异比较,避免了嵌套循环。每次执行都会重新生成result文件。
阅读全文