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

  • 本文关键字:无序 比较 文件 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"我尝试谷歌搜索,但找不到任何有用的东西。

我知道这不是纯Java解决方案,但是如果您可以访问 *nix框:

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

将为您提供所需的东西。

,然后查看这个问题如何从Java运行Shell脚本。

编辑:

我想说的是,要计算差异有2个步骤:

  1. 对两个文件进行分类。
  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环境中测量的时间。

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

最新更新