Scala中如何将多组字符串映射为整数值并实现求和?
解决字符串到整数映射求和的问题
你当前用Enumeration的思路不对——Scala的Enumeration是用来定义枚举类型的,不是存字符串到整数的键值对映射的,所以没法直接实现你要的查找逻辑。下面给你两种简洁的方案,都能避免大量if/else判断:
方案一:用Map直接存映射(推荐,简洁高效)
直接用Scala的Map来存储字符串和整数的对应关系,天然支持快速查找,代码也最简洁:
// 定义类型映射 object TypeMapping { val values: Map[String, Int] = Map( "type1" -> 5, "type2" -> 6 // 实际场景中直接追加更多键值对即可 ) } // 定义增长类型映射 object GrowthMapping { val values: Map[String, Int] = Map( "growth1" -> 1, "growth2" -> 10 // 实际场景中直接追加更多键值对即可 ) } // 实现求和函数 def sum(typeStr: String, growthStr: String): Int = { // 处理未知输入的情况:要么抛异常,要么用getOrElse返回默认值(比如0) val typeVal = TypeMapping.values.getOrElse(typeStr, throw new IllegalArgumentException(s"无效的类型字符串: $typeStr")) val growthVal = GrowthMapping.values.getOrElse(growthStr, throw new IllegalArgumentException(s"无效的增长类型字符串: $growthStr")) typeVal + growthVal }
测试调用:sum("type1", "growth2")会返回15,完全符合预期。
方案二:自定义密封枚举(适合需要类型安全的场景)
如果你的场景需要更强的类型约束(比如避免在代码中直接传字符串),可以用密封特质自定义枚举类,同时内部维护字符串到枚举实例的映射:
// 类型枚举定义 sealed trait TypeEnum { def value: Int def name: String } object TypeEnum { case object Type1 extends TypeEnum { val value = 5; val name = "type1" } case object Type2 extends TypeEnum { val value = 6; val name = "type2" } // 内部维护字符串到枚举的映射 private val nameToEnum = values.map(e => e.name -> e).toMap // 根据字符串获取枚举实例 def fromName(name: String): TypeEnum = nameToEnum.getOrElse(name, throw new IllegalArgumentException(s"未知类型: $name")) // 枚举实例列表 private def values: Seq[TypeEnum] = Seq(Type1, Type2) } // 增长类型枚举定义 sealed trait GrowthEnum { def value: Int def name: String } object GrowthEnum { case object Growth1 extends GrowthEnum { val value = 1; val name = "growth1" } case object Growth2 extends GrowthEnum { val value = 10; val name = "growth2" } private val nameToEnum = values.map(e => e.name -> e).toMap def fromName(name: String): GrowthEnum = nameToEnum.getOrElse(name, throw new IllegalArgumentException(s"未知增长类型: $name")) private def values: Seq[GrowthEnum] = Seq(Growth1, Growth2) } // 求和函数 def sum(typeStr: String, growthStr: String): Int = { TypeEnum.fromName(typeStr).value + GrowthEnum.fromName(growthStr).value }
这种方式除了能实现字符串转整数求和,还能在其他场景中直接使用枚举实例,避免字符串硬编码的错误。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

