【问题标题】:intersection in java using hashmap or array listjava中使用hashmap或数组列表的交集
【发布时间】:2015-11-16 09:34:19
【问题描述】:

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

在数组列表中使用 contains 方法和在哈希映射中结合两个哈希映射使用单个 for 循环

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

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

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

我的文件如下所示:-

'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'

单引号分隔两列。

【问题讨论】:

  • “反逗号”?你的意思是' 引号?
  • 或者,空格是否将两列分开?

标签: java arrays


【解决方案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);

【讨论】:

  • Sprinter:- 你能建议我如何阅读这种类型的文件吗?因为我只是直接把它读到一个数组列表中。
  • @saumilpatel 添加了 Java 7 版本。请提出一个关于阅读文件的新问题。
  • 我尝试了这个 retainAll 方法,但是它将如何获取两个文件的第 2 列,这些文件对应于相交文件的列@sprinter
  • @saumilpatel 这正是我建议 Record 课程的原因:所以您不需要第二个列表。
  • 这就是我想知道的,hoow 记录类将使用该方法及其构造函数表示 2 列。我不明白
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多