首页 > 解决方案 > 如何从 List[A] 中删除作为映射值的序列 A 的元素(B->List[A])

问题描述

我有这个数据:

//H1 = house name
//H2 = price
//H3 = size
//H4 = location

//List(H1, H2, H3, H4)

val houses = List(
  ("House_A", 250, 120, "NYC"),
  ("House_B", 90, 100, "BR"),
  ("House_C", 300, 500, "BR"),
  ("House_D", 120, 90, "NYC"),
  ("House_E", 320, 250, "BR"),
  ("House_F", 290, 450, "SA"),
  ("House_G", 290, 450, "NYC"),
  ("House_F", 450, 100, "FR"),
  ("House_H", 210, 92, "SA"),
  ("House_I", 240, 100, "FR"),
  ("House_J", 395, 80, "FR"),
  ("House_K", 140, 125, "NYC"),
  ("House_L", 900, 250, "BR"),
  ("House_M", 300, 110, "FR")
)

并希望以这种格式访问“列出价格(H1)> 100 且超过 1 所房子的地方” :

List((H4, List(H1,H2,H3)))

问题

我的问题是我不知道如何从应该是 List(H1,H2,H3) 的列表中删除 H4(place)。

我试过的

这和我得到的一样好

houses
  .filter(_._2 > 100)
  .groupBy(_._4)
  .filter(a => a._2.length > 1) // this is the map I talk about in the title: Map(H4 -> List(H1, H2, H3, H4))
  .toList
List(
  (BR,List((House_C,300,500,BR), (House_E,320,250,BR), (House_L,900,250,BR))),
  (NYC,List((House_A,250,120,NYC), (House_D,120,90,NYC), (House_G,290,450,NYC), (House_K,140,125,NYC))),
  (FR,List((House_F,450,100,FR), (House_I,240,100,FR), (House_J,395,80,FR), (House_M,300,110,FR))),
  (SA,List((House_F,290,450,SA), (House_H,210,92,SA))))

标签: scala

解决方案


你离得太近了!
您只需要map在内部组中删除不需要的。而且,因为您需要为每个内部组执行此操作,所以您想要map所有的Map

houses
  .filter(_._2 > 100)
  .groupBy(_._4)
  .filter(a => a._2.length > 1)
  .map {
    case (location, group) =>
      location -> group.map {
        case (house, price, size, _) =>
          (house, price, size)
      }
  }.toList

奖励:为了使代码更高效,你可以。

  • 合并filter&mapcollect.
  • 您不需要列表的所有大小,只需检查它是否大于 1。
    (此仅适用于 Scala 2.13 +

-

houses
  .filter(_._2 > 100)
  .groupBy(_._4)
  .collect {
    case (location, group) if (group.sizeIs > 1) =>
      location -> group.map {
        case (house, price, size, _) =>
          (house, price, size)
      }
  }.toList

推荐阅读