【问题标题】:How to separate similar tuples based on some similar attribute?如何根据一些相似的属性分离相似的元组?
【发布时间】:2020-10-18 04:58:08
【问题描述】:

我有一个如下所示的元组列表:

val days= List(("Sunday", 1), ("Monday", 2), ("Tuesday", 1),
        ("Wednesday", 2), ("Thursday", 3), ("Friday", 2),
        ("Saturday", 3))

我希望最终结果如下所示:

"data": [
  [
    "Sunday, 1",
    "Tuesday, 1"
  ],
  [
    "Monday, 2",
    "Friday, 2"
    "Wednesday,2"
  ],
  [
    "Thursday, 3",
    "Saturday,3"
  ]
]

【问题讨论】:

    标签: list scala functional-programming tuples scala-collections


    【解决方案1】:

    您可以分组然后映射值:

    days.groupBy(_._2)
        .mapValues(_.map { case (name, nr) => s"$name, $nr" } )
        .valuesIterator.toList
    

    结果是:

     List(List(Monday, 2, Wednesday, 2, Friday, 2), List(Sunday, 1, Tuesday, 1), List(Thursday, 3, Saturday, 3))
    

    P.S.:正如 Luis Miguel Mejía Suárez 所建议的,使用 groupMap(来自 scala 2.13)可以使这更加简洁和可读:

    days.groupMap(_._2) { case (name, nr) => s"$name, $nr" }
        .valuesIterator.toList
    

    【讨论】:

    • @LuisMiguelMejíaSuárez 2.13 左右我玩的不多,但我会尝试更新,谢谢
    • @LuisMiguelMejíaSuárez 我不确定我是否理解第二点,我应该不打电话给toList就离开吗?
    • @Andronicus no no,连同toList。所以重点很简单,values 返回一个包含所有值的集合 (可能是一个列表,但谁知道),然后将该集合转换为一个列表,因此您可以使用中间集合而不是中间集合values Iterator (而不是 values 您将立即调用 toList 这意味着不会有中间集合,只有最终列表。
    • 总之,使用任何你觉得更好的东西。我个人还是更喜欢直接使用迭代器。从技术上讲,values 可能会更改为返回 List 或 Vector 或其他任何内容,因为 stdlib 只承诺返回 Iterable
    • @LuisMiguelMejíaSuárez 通过回答这个简单的问题,我学到了很多东西,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多