的Java /科特林:寻找多个HashSets的由类ID的交点(Java/Kotlin: Findi

2019-09-27 14:51发布

我无法查找包含一个数据类(其中,我想通过标识符来相交)散列集的阵列的交叉点:

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

我拉着从.csv文件到这种类型结构的一些数据:

ArrayList<HashSet<Protein>>

所以我有六个数组列表[1对于每个CSV],包含数千个蛋白质结构的每个包含一个散列集。 这是我到目前为止已经试过基于断共同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
}

这将返回一个空列表,这使得因为它试图相交蛋白的对象和相互匹配的标准作为一个整体感。

如何调用数据[I] .ID为我的交集标准是什么? 我是相当新的科特林和数据类:)

Answer 1:

如果添加定义为hashCodeequals在功能Protein如下类,那么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) } }
}


Answer 2:

为了简化给出答案,你可以使用apply

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


文章来源: Java/Kotlin: Finding the intersection of multiple HashSets by class ID