Scala 使用值在可变映射中查找键

Scala 使用值在可变映射中查找键,scala,scala-collections,Scala,Scala Collections,我们的案例类项目和类别映射如下所示: 案例类Itemid:Int,名称:String val categoryMap=scala.collection.mutable.Map[CategoryId:Int,List[Item]] 如果我们有项目的id,如何在“categoryMap”中找到CategoryId键?从id到类别构建另一个映射项目的一些不相关字段被忽略: 打印:2 2 3。请尝试以下代码: case class Item(id: Int, name: String) val item

我们的案例类项目和类别映射如下所示:

案例类Itemid:Int,名称:String

val categoryMap=scala.collection.mutable.Map[CategoryId:Int,List[Item]]

如果我们有项目的id,如何在“categoryMap”中找到CategoryId键?

从id到类别构建另一个映射项目的一些不相关字段被忽略:

打印:2 2 3。

请尝试以下代码:

case class Item(id: Int, name: String)
val item1 = List(Item(1001, "HP"), Item(1002, "Dell"))
val item2 = List(Item(1003, "Fish1"), Item(1004, "Fish2"))
val categoryMap = scala.collection.mutable.Map[Int, List[Item]](100 -> item1,101 -> item2)
val catmap = categoryMap.flatMap { case (key, value) => value.map(_.id -> key) }
println(catmap.getOrElse(1001, null))
产量:100


你的问题的标题和你的实际问题是两码事。你需要哪一个?@YuvalItzchakov我找不到一个题目与正文太不一样的修订版。OP有一个从类别键到项目值列表的映射,现在希望找到给定项目值id的类别键。对我来说,这似乎是一个合理而明确的问题。如果这个问题没有使用现在使用的“价值”这个词,那么这个问题会变得更清楚吗?@Andreytukin You和Stefano对同一个问题给出了完全不同的答案。我认为这是由于键有一个Int字段的模糊性造成的,我们的大脑可能会自动为我们在Item case类中的Id字段和该Int之间建立关联,因为它们也按类型对齐。这就是为什么我认为这个问题应该澄清。@YuvalItzchakov是的,对。。。事实上,有两种不同的答案。我认为可以尝试在代码中小心地插入一些类型别名,以澄清条目ID和类别之间的区别。否则到处都是Int。。。也许OP应该更新它,因为我也不能100%确定我是否理解正确。可以在多个类别中找到id吗?换句话说,我们可能需要多个键才能找到给定id的每个引用吗?.toList不需要。@Andrey如果我尝试在SCALA工作表中运行,我得到的结果是:定义的类项java.lang.NoSuchMethodError:SCALA.Product.$init$Lscala/Product;V在com.src.A$A13$A$A13$Item.teset.sc:1在com.src.A$A13$A$A13.categoryMap$lzycomputeTestet.sc:4在com.src.A$A13$A$A13.categoryMapteset.sc:3在com.src.A$A13$A$A13.get$$instance$$categoryMapteset.sc:3在worksheet.sc:24进入REPL模式工作正常,为什么?有什么想法吗?@AdityaChopra如果它甚至找不到scala.Product.$init$,那么无论它是什么,您的工作表都会出现严重问题。如果将上述代码解释为scala 2.12版的脚本,则会运行。4@AndreyTyukin哦好的,谢谢@jwvh我99.9999%确信你是对的。但是因为,而且因为我没有时间为这个小片段编写测试用例,所以我犹豫是否从代码中删除toList。这是因为与Map相比,List实际上是一个适当的monad,所以我不必考虑flatMap和Map行之间的所有CBF在for comprehension中隐式出现的情况。
case class Item(id: Int, name: String)
val item1 = List(Item(1001, "HP"), Item(1002, "Dell"))
val item2 = List(Item(1003, "Fish1"), Item(1004, "Fish2"))
val categoryMap = scala.collection.mutable.Map[Int, List[Item]](100 -> item1,101 -> item2)
val catmap = categoryMap.flatMap { case (key, value) => value.map(_.id -> key) }
println(catmap.getOrElse(1001, null))