在Scala中,我尝试使用Map值基于唯一属性过滤地图。
case class Product(
item: Item,
)
productModels: Map[Int, Product]
如何创建新的Map
(或过滤器productModels
)以仅包含Product.Item.someproperty
中Map
唯一的值?
我在productModel上尝试foldLeft
,但似乎无法获得它。我会继续尝试,但也想和你们一起检查。
由于
答案 0 :(得分:0)
最简单的方法是将地图转换为另一个地图,其中的关键字是Item
所需的字段:
case class Product(item:String)
val productModels =
Map(
1 -> Product("a"),
2 -> Product("b"),
3 -> Product("c"),
4 -> Product("a")
)
// here I'm calculating distinct by Product.item for simplicity
productModels.map { case e@(_, v) => v.item -> e }.values.toMap
结果:
Map(4 -> Product(a), 2 -> Product(b), 3 -> Product(c))
请注意,元素的顺序无法保证,因为通用Map
没有特定的键顺序。如果您使用具有项目顺序的Map
,例如ListMap
并希望保留元素的顺序,则必须进行必要的调整:
productModels.toList.reverse.map { case e@(_, v) => v.item -> e }.toMap.values.toMap
结果:
res1: scala.collection.immutable.Map[Int,Product] = Map(1 -> Product(a), 3 -> Product(c), 2 -> Product(b))
答案 1 :(得分:0)
case class Item(property:String)
case class Product(item:Item)
val xs = Map[Int, Product]() // your example has this data structure
// just filter the map based on the item property value
xs filter { case (k,v) => v.item.property == "some property value" }
答案 2 :(得分:0)
以下是foldLeft
的实现:
productModels.foldLeft(Map.empty[Int, Product]){
(acc, el) =>
if (acc.exists(_._2.item.someproperty == el._2.item.someproperty)) acc
else acc + el
}