1

我有两个文件,分别是 file1.txt 和 file2.txt。这两个文件都包含一些由a分隔的内容<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;
            }

我能够到达路口,唯一的问题是维持秩序。

4

1 回答 1

1

如果您首先对这两个列表进行排序,则可以轻松完成此操作。然后直接合并。

如果顺序很重要,请使用稳定的排序。归并排序是稳定的。

另一种方法是从一个列表构建一个哈希表,然后遍历另一个列表,根据哈希表检查每个项目。在这里,重要的是要知道你想要的东西是哪个“顺序”。例如,如果你有列表 A 和列表 B:

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


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

如果您希望结果为“foo, bar”,则从列表 B 创建哈希表。如果您希望输出为“bar, foo”,则从列表 A 创建哈希表。

于 2013-10-21T13:28:01.443 回答