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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:15:29