使用hashmap或数组列表在java中的交集

时间:2015-11-13 21:32:58

标签: java arrays

我知道如何处理两个文件的交集。 使用哈希映射或数组列表。

在数组列表中使用contains方法并在哈希映射中组合两个哈希映射suing single for loop

但在处理我的文件时遇到问题。

我的文件各有两列。我只想与两个文件的第一列相交。

那些相交的列将存储在新文件中,但我还想存储这两个文件中相交列的第二列。 任何人都可以建议我如何获取文件的这两列。

我的文件如下: -

  

' 1' ' 2,4'

     

' 2' ' 3,4,5'

     

' 3' ' 2,3,4'

     

' 5' ' 3,4,5'

     

' 1,3' ' 2,4'

     

' 2,3' ' 3,4'

     

' 2,5' ' 3,4,5'

     

' 3,5' ' 3,4'

     

' 2,3,5' ' 3,4'

单引号分隔两列。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您就会询问如何在保留对第二个列表中的等效数据的引用的同时找到两个列表的交集。您有很多关于文件格式的信息,但您没有询问有关阅读文件的任何问题,因此我会假设您已经确定了。如果没有,那么我建议您提出一个关于以您的格式阅读文件的单独问题。

首先,如果您的文件中的每一行似乎都代表一条记录,您应该创建一个类来表示该记录,其中包含两个列'数据表示为实例变量。您将需要比较和打印记录的方法。我忽略了构造函数等。

class Record {
    private final String value1;
    private final String value2;

    public boolean value1_Equals(Record other) {
        return this.value1.equals(other.value1);
    }

    public void printTo(OutputStream out) {
        ...
    }
}

其次,将两个数据文件读入两个记录列表:

List<Record> records1;
List<Record> records2;

第三,创建一个与这两者相交的新列表。这是使用Java 8流的示例;如果你没有Java 8添加评论,我会在Java 7中给出一个等价物(虽然你的问题似乎已经知道如何做到这一点):

List<Record> intersection = records1.stream()
    .filter(record -> record2.stream().anyMatch(record::value1_Equals))
    .collect(Collectors.toList());

最后,在新列表中打印交叉点:

intersection.forEach(record -> record.printTo(file));

不使用流的等效版本可能是:

List<Record> intersection = new ArrayList(records1);
intersection.retainAll(records2);
for (Record record: intersection)
    record.printTo(file);