You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中自定义Shape类作为Map键时出现键未找到错误求助

问题根源与解决方案

你遇到的问题确实和HashMap的相等性判断逻辑有关——Scala默认的Map(底层是HashMap)依赖键的equals和hashCode方法来定位元素。自定义类如果没有正确实现这两个方法,哪怕对象内容完全一致,也会被判定为不同的键。

为什么直接用示例实例能成功?

你在工作表中用Shapes_sample.symmetryTable(Shapes_sample.corner)能找到值,是因为存进Map的corner和你调用时用的是同一个对象实例,Scala类默认的equals是引用相等(判断两个变量是否指向同一个内存地址),这种情况下刚好能匹配。但函数中传入的shape变量,哪怕内容和Map里的键完全一致,只要是不同的实例,默认的引用相等判断就会失效,导致找不到键。

解决办法

给你的Shape类正确实现equals和hashCode方法,有两种简便方式:

  1. 改用case class(推荐):
    Scala的case类会自动基于所有成员变量生成正确的equals和hashCode方法,无需手动编写。只需把class Shape(...)改成:
    case class Shape(/* 你的成员变量 */)
    
  2. 手动实现equals和hashCode:
    如果不能使用case类,要确保两个Shape对象在所有关键属性相同时,equals返回true,且hashCode返回相同值。假设你的Shape核心属性是points集合,示例如下:
    class Shape(val points: Set[(Int, Int)]) {
      override def equals(obj: Any): Boolean = obj match {
        case other: Shape => this.points == other.points
        case _ => false
      }
    
      override def hashCode(): Int = points.hashCode()
    }
    

验证与优化

  • 修改后可以先打印shape.hashCode()和Map中对应键的hashCode(),确认两者是否一致;再用symmetryTable.contains(shape)检查是否能找到键。
  • 你的getSymmetriesForShape函数可以优化类型安全性:把参数shape: Any改成shape: Shape,去掉不必要的模式匹配,简化代码。

内容的提问来源于stack exchange,提问作者Braden Christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:25:56