文件比较 - 内容可能是无序的

时间:2014-03-14 07:06:49

标签: 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

file1和file2的比较应返回“sheetal kumar 3” 我尝试使用谷歌搜索,但无法找到任何有用的东西。

3 个答案:

答案 0 :(得分:2)

我知道这不是纯粹的java解决方案,但是如果你有权访问* nix框:

sort file1 > sorted1; sort file2 > sorted2;comm -3 sorted1 sorted2;

会准确地为您提供所需的信息。

然后看看this question如何从java运行shell脚本。

修改

我想说的是,你计算差异有两个步骤:

  1. 对两个文件进行排序。
  2. 逐行比较它们以找出差异。

答案 1 :(得分:0)

根据 huge 的含义,你可以使用HashSet首先浏览一个文件并将每一行添加到哈希集中,然后通过另一个文件和从哈希集中删除您正在从另一个文件中读取的行。这假定每一行都是唯一的。

答案 2 :(得分:0)

我遇到了同样的问题,并写了一个比较函数:

/**
 * 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环境中测量的时间。

(免责声明:我只针对此功能进行了一些基本测试)