2014-03-14 87 views
1

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的比較應該返回「庫馬爾希塔爾3」 我試着用搜索引擎,但沒能找到什麼有用的東西。

+0

在這種情況下「巨大文件」有多大? –

+1

@kushi有什麼特別的原因不會在數據庫中做diff? –

回答

0

根據你的意思是巨大什麼,你可以使用一個HashSet先通過一個文件和每個行添加到哈希集合,然後,經過其他文件,並從哈希集合,刪除線您現在正在閱讀其他文件。這假定每一行都是唯一的。

+0

我想過這個。但是有沒有第三方/ Java API來實現這一目標? – kushi

+1

@kushi:好像有些東西[在這裏](http://code.google.com/p/java-diff-utils/),問題是我不確定它是否忽略順序。 – npinti

2

我知道這是不是一個純Java的解決方案,但如果你有機會到* nix中框:

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

會給你正是你需要的。

然後看看this question關於如何從java運行shell腳本。

編輯:

我想說的是,你計算DIFF有兩個步驟:

  1. 排序這兩個文件。
  2. 將它們逐行比較以找出差異。
+0

謝謝..但我怎麼知道哪些文件中的行不同? – kushi

+0

如果你有興趣,我可以建議'diff' .. 再次,所有這些都是標準的unix shell實用程序。 –

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環境測量的時間。

(免責聲明:我只對此功能做了一些基本測試)