HashMap <data class,=“”data =“”class =“”> object.keySet()函数抛出与公共调用相关的错误

时间:2018-04-20 05:27:19

标签: java hashmap kotlin hashset

我有一个数据类:

data class UniqueProtein(var id: String, var spc: Int, var r: DoubleArray)

我已创建了一个{I},我想将其转换为HashSet,因此我可以找到两个HashMaps之间的重叠值,如下所示:

HashMap<UniqueProtein, UniqueProtein>

IntelliJ在keySet()调用下抛出以下内联错误:

dottest(control: HashMap<UniqueProtein, UniqueProtein>, treatment: HashMap<UniqueProtein, UniqueProtein>) 

var combineddata:HashSet<UniqueProtein> = control.keySet().retainAll(treatment.keySet())

但由于我已将该对象声明为数据类,因此我不确定发生了什么......

2 个答案:

答案 0 :(得分:3)

如果您正在寻找两张地图中的公用密钥,则只需intersect他们的密钥,就像这样:

val combinedData: Set<UniqueProtein> = control.keys.intersect(treatment.keys)

这将返回一个包含两个集合的公共元素的新集合。

如果你进入它的实现,你会发现它只是使用retainAll(在它被调用的集合的副本上):

public infix fun <T> Iterable<T>.intersect(other: Iterable<T>): Set<T> {
    val set = this.toMutableSet()
    set.retainAll(other)
    return set
}

答案 1 :(得分:2)

您可以通过keys成员访问密钥集。

然后过滤属于第二张地图的键:

val combinedData = control.keys.filter { treatment.keys.contains(it) }.toSet()

按键过滤整个地图(取回条目而不仅仅是按键):

var filteredMapByKeys = control.filterKeys { treatment.keys.contains(it) }

根据键过滤值:

var filteredValuesByKeys = control.filterKeys { treatment.keys.contains(it) }.values.toSet()