2013-10-21 68 views
1

我有兩個文件說file1.txt和file2.txt。這兩個文件包含由<TAB>查找與維護排序的兩個文件的交集

例如文件分離部分內容1包含

123abc  us.online.com 
ab123  us.online.co 

文件2包含

123abc  us.zhang.com 
456def  us.ppd.456def 
def56  cn.online.pek 
ab123  us.portlet.co 

現在,我需要找到在Java中,這兩個文件的基礎交集就是第一場。所以我的輸出應該基本上是

123abc  us.online.com  123abc  us.zhang.com 
ab123  us.online.co  ab123  us.portlet.co 

有沒有一種有效的方法來做到這一點在Java?這是我到目前爲止所嘗試的

List<String> logRid = new ArrayList<String>(); 
    List<String> fatalRid = new ArrayList<String>(); 
    File logFile = new File("logs.txt"); 
    File rtlaFile = new File("rtla.txt"); 
    BufferedReader reader = null; 

public List<String> readFiles(){ 
        try 
        { 
          reader = new BufferedReader(new FileReader(logFile)); 
          String text = null; 
          while((text = reader.readLine()) != null) 
          { 
            logRid.add(text); 
          } 

        } 
        catch (Exception e) { 
          e.printStackTrace(); 
        } 
        try 
        { 
          reader = new BufferedReader(new FileReader(rtlaFile)); 
          String text = null; 
          while((text = reader.readLine()) != null) 
          { 
            fatalRid.add(text); 
          } 

        } 
        catch (Exception e1) { 
          e1.printStackTrace(); 
        } 

        return this.intersection(logRid, fatalRid); 
      } 
public <T> List<T> intersection(List<T> list1, List<T> list2) 
      { 
        List<T> list = new ArrayList<T>(); 

        for (T t : list1) { 
          if(list2.contains(t)){ 
            list.add(t); 
          } 

        } 
        return list; 
      } 

我能夠得到交集,唯一的問題是維護順序。

+1

你試過什麼算法/邏輯?請發佈你的代碼? – Hariharan

+2

我認爲最簡單的方法就是使用Maps(HashMap)。只是1)解析你的文件到兩個地圖中,2)在單個foreach循環中合併兩個地圖 –

+4

我同意Map的想法;然而,只需要一個Map就可以立即處理第二個文件(如果它很重要,也可以用來維護排序)。如果這兩個文件中的鍵都是(或可以)排序的,那麼一個簡單的2路合併循環就可以完成。另外,將數據加載到SQLite首先xD – user2864740

回答

1

如果您首先對兩個列表進行排序,則可以輕鬆完成此操作。然後做一個直接合並。

如果訂單很重要,請使用穩定的排序。合併排序穩定。

另一種方法是從一個列表中構建一個哈希表,然後遍歷另一個列表,根據哈希表檢查每個項目。這裏要知道你想要的「命令」的事情是很重要的。例如,如果你有名單A和名單B:

List A 
------ 
foo whatever 
bar whatever 


List B 
------ 
bar whatever 
foo whatever 

如果你想要得到的結果是「富,酒吧」,那麼你就創建如果你想輸出爲「bar,foo」,那麼從列表A創建哈希表。