首页 文章

Java / Kotlin:按类ID查找多个HashSet的交集

提问于
浏览
1

我找不到包含数据类的哈希集数组的交集(我希望通过标识符交叉):

class Protein(val id: String, val score: Double, val molw: Double, val spc: Int)

我已经将.csv文件中的一些数据提取到这种类型的结构中:

ArrayList<HashSet<Protein>>

所以我有六个数组列表[每个csv 1个],每个包含一个包含数千个蛋白质结构的散列集 . 这是我到目前为止尝试获得基于常见Protein.id的交集HashSet:

fun intersection(data: ArrayList<HashSet<Protein>>): HashSet<Protein> {

val intersectionSet = HashSet<Protein>(data[0])

for (i in 1..data.size) {
    intersectionSet.retainAll(data[i])
}
return intersectionSet
}

这将返回一个空列表,这是有道理的,因为它正在尝试与Protein对象相交并将每个条件作为一个整体进行匹配 .

如何将数据[i] .id称为我的交叉标准?我对Kotlin和数据类很新:)

2 回答

  • 2

    如果在 Protein 类中添加 hashCodeequals 函数的定义,如下所示,则 HashSet 将能够使用 id 字段正确检查交集 .

    class Protein(val id: String, val score: Double, val molw: Double, val spc: Int) {
      override fun hashCode() = id.hashCode()
      override fun equals(other: Any?) = other?.let { id == (it as Protein).id } ?: false
    }
    

    此外,您可能希望将 intersection 函数中的循环范围更改为 1..(data.size-1) 而不是 1..data.size ,以避免超出范围 . 或者你可以按功能编写如下:

    fun intersection(data: ArrayList<HashSet<Protein>>): HashSet<Protein> {
      return data.reduce { acc, it -> acc.apply { retainAll(it) } }
    }
    
  • 1

    要简化给定的答案,您可以使用 apply

    return data.reduce { acc, it -> acc.apply { retainAll(it) } }
    

相关问题