folder1和folder2下的文件将具有相同的名称,我希望2比较这些文件。我对此感到震惊。是否有Java API进行此比较。文件大小可能很大
示例:
folder1/file1
----------
kushi,metha,2
kushi,barun,1
arun,mital,3
folder2/file1
----------
arun,mital,3
kushi,metha,2
sheetal,kumar,3
kushi,barun,1
File1和File2的比较应返回" Sheetal Kumar 3"我尝试谷歌搜索,但找不到任何有用的东西。
我知道这不是纯Java解决方案,但是如果您可以访问 *nix框:
sort file1 > sorted1; sort file2 > sorted2;comm -3 sorted1 sorted2;
将为您提供所需的东西。
,然后查看这个问题如何从Java运行Shell脚本。
编辑:
我想说的是,要计算差异有2个步骤:
- 对两个文件进行分类。
- 通过行比较它们以找到差异。
取决于您的含义巨大,您可以使用 HashSet
首先通过一个文件,然后将每行添加到哈希集合中,然后浏览另一个文件和哈希集合,删除您现在正在从另一个文件中读取的行。假设每行都是唯一的。
我遇到了同样的问题,并写一个比较功能:
/**
* Compare two sequences of lines without considering order.
* <p>
* Input parameter will not be modified.
*/
public static <T> boolean isEqualWithoutOrder(final T[] lines1, final T[] lines2) {
if (lines1 == null && lines2 == null) return true;
if (lines1 == null) return false;
if (lines2 == null) return false;
if (lines1.length != lines2.length) return false;
final int length = lines1.length;
int equalCnt = 0;
final boolean[] mask = new boolean[length];
Arrays.fill(mask, true);
for (int i = 0; i < lines2.length; i++) {
final T line2 = lines2[i];
for (int j = 0; j < lines1.length; j++) {
final T line1 = lines1[j];
if (mask[j] && Objects.equal(line1, line2)) {
equalCnt++;
mask[j] = false;
//if two equal lines is found, more subsequent equal lines are speculated
while (j + 1 < length && i + 1 < length &&
Objects.equal(lines1[j + 1], lines2[i + 1])) {
equalCnt++;
mask[j + 1] = false;
j++;
i++;
}
break;
}
}
if (equalCnt < i) return false;
}
return equalCnt == length;
}
常见收集可能很慢,速度比较:
//lines1: Seq[String], lines2: Seq[String] of 100k lines of equal Random String but without ordering.
FastUtils.isEqualWithoutOrder(lines1.toArray, lines2.toArray) //97 ms
lines1.sorted == lines2.sorted //836 ms
在热SBT环境中测量的时间。
(免责声明:我只对此功能进行了一些基本测试)