【问题标题】:HashMap<data class, data class> object.keySet() function throws error relating to a public callHashMap<data class, data class> object.keySet() 函数抛出与公共调用相关的错误
【发布时间】:2018-04-20 05:27:18
【问题描述】:

我有一个数据类:

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

我创建了一个 HashMap&lt;UniqueProtein, UniqueProtein&gt;,我想将其转换为 HashSet,这样我就可以找到两个 HashMap 之间的重叠值,如下所示:

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

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

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

is public /*package*/ in 'HashMap'

但是由于我已经将对象声明为数据类,所以我不确定发生了什么......

【问题讨论】:

  • 那么,你想取回control 的密钥作为一个集合,这也是treatment 的一部分作为密钥?
  • 对 - 我正在寻找两个集合之间常见的 UniqueProtein 类对象。
  • 以下两个答案都为上述问题提供了很好的解决方案:Dvarga 选择了函数式编程调用,zsmb13 选择了 intersect 方法。我会让社区决定哪个答案值得打勾,稍后再回来标记。

标签: java hashmap kotlin hashset


【解决方案1】:

如果您要查找两个映射中的公共键,您可以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
}

【讨论】:

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

    【讨论】:

    • 让这个工作正常。谢谢!也感谢您的替代方法
    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多