2013-10-21 33 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创建哈希表。