Как удалить элемент последовательности A из списка [A], который является значением карты (B-> List [A]) - PullRequest
0 голосов
/ 17 января 2020

У меня есть эти данные:

//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 и более чем один дом" в этом формате:

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

Проблема

Моя проблема в том, что я не могу понять, как удалить H4 (место) из списка, который должен быть List ( H1, H2, H3).

То, что я пытался

Это так же хорошо, как я понял

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))))

1 Ответ

3 голосов
/ 17 января 2020

Вы были слишком близко!
Вам нужно только 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 & map в collect.
  • Вам не нужен весь размер списка, просто проверьте, если оно больше 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...