Java 文件比较-内容可能无序
folder1和folder2下的文件将具有相同的名称,我希望2比较这些文件。 我被这个打动了。是否有用于进行此比较的JAVA API。 文件大小可能很大 例如:Java 文件比较-内容可能无序,java,Java,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 文件1和文件2的比较应返回“shee
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
文件1和文件2的比较应返回“sheetal kumar 3”
我试着用谷歌搜索,但没有找到任何有用的东西。根据你所说的“大”的意思,你可以使用a先浏览一个文件并将每一行添加到哈希集中,然后浏览另一个文件并从哈希集中删除你现在从另一个文件中读取的行。这假设每一行都是唯一的。我知道这不是纯java解决方案,但如果您可以访问*nix框:
sort file1>sorted1;排序文件2>sorted2;通信-3分拣1分拣2代码>
会给你你所需要的
然后看看如何从java运行shell脚本
编辑:
我想说的是,要计算差异,有两个步骤:
对两个文件进行排序
逐行比较,找出差异
我遇到了同样的问题,并编写了一个比较函数:
/**
* 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;
}
在热sbt环境中测量的时间
(免责声明:我只对这个函数做了一些基本的测试)在这种情况下“巨大的文件”有多大?@kushi当时有没有什么特殊的理由不在数据库中进行区分?我想到了这个。但是有没有第三方/java api可以做到这一点呢?@kushi:似乎有些东西,问题是我不确定它是否忽略了订单。谢谢。。但是我怎么知道哪一行在哪个文件中是不同的呢?如果您对此感兴趣,我建议diff
。。同样,所有这些都是标准的unixshell实用程序。
//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