代码之家  ›  专栏  ›  技术社区  ›  Mark Green

在Kotlin中,HashSet包含按hash重复的元素

  •  1
  • Mark Green  · 技术社区  · 6 年前

    val done = HashSet<StudentProgrammeState>()
    

    处理结束时,检查如下:

    if (done.distinctBy { it.hashCode() }.size < done.size ) {
        println("Duplicate states were evaluated.")
    }
    

    每次运行都会显示此消息。自从 done 是一个 HashSet HashCode

    下面是 StudentProgrammeState :

    class StudentProgrammeState(val program: Program) {
        val instances = HashSet<StudentModuleInstance>()
    
        override fun equals(other: Any?): Boolean {
            if (!(other is StudentProgrammeState)) return false
            return (other.program == program) && 
              (other.instances.containsAll(instances) && 
              instances.containsAll(other.instances))
        }
        override fun hashCode() = Objects.hash(program, instances)
    

    Equals 这里不直接检查 hashCode instances 但是这个测试应该对应于无序的集合相等。

    对于学生模块仪器:

    typealias StudentModuleInstance = Pair<Module, Int>
    

    Pair<> 是内在的 data class equals hashcode

    价值 program

    1 回复  |  直到 6 年前
        1
  •  7
  •   Paul Hicks    6 年前

    HashSet.add() 提供本合同:

    如果指定的元素不存在,则将其添加到此集。 更正式地说,如果这个集合 如果此集合已包含元素,则调用将离开集合 不变并返回false。

    特别地, hashCode 进入散列集。

    具有相同哈希代码但不等于的项将在同一个bucket中结束,这会降低 get() 为了那些东西。但除此之外,hashCode并不重要。