Scala根据地图值

时间:2016-04-13 18:03:44

标签: scala

在Scala中,我尝试使用Map值基于唯一属性过滤地图。

case class Product(
  item: Item,
)
productModels: Map[Int, Product]

如何创建新的Map(或过滤器productModels)以仅包含Product.Item.somepropertyMap唯一的值?

我在productModel上尝试foldLeft,但似乎无法获得它。我会继续尝试,但也想和你们一起检查。

由于

3 个答案:

答案 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
}