【问题标题】:scala how do you group elements in a mapscala你如何对地图中的元素进行分组
【发布时间】:2018-07-19 13:44:48
【问题描述】:

当且仅当它们以特定的文字字符串结尾(在这种情况下为chain)时,我想将列表中的元素与以下元素分组。我怎样才能做到这一点?

这就是我所拥有的:

val rules_intial = List("r1", "r2", "r3 chain", "r4", "r5 chain", "r6 chain", "r7")

这是我想要得到的:

val rules_final = List("r1", "r2", List("r3 chain", "r4"), List("r5 chain", "r6 chain",  "r7chain", "r8"), "r9", List("r10chain", "r11"))

【问题讨论】:

  • 不清楚。
  • 请不要放代码截图的链接 - 复制并粘贴您的代码,这样我们就可以在这里看到它,这样我们就可以将它复制并粘贴到我们自己的编辑器中。此外,如果图片链接中断,没有人会知道您的代码是什么。
  • 您遇到问题的代码是什么?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?请提供minimal reproducible example
  • 您能否提供一个精确说明您希望发生的事情,包括任何和所有规则、这些规则的例外情况、极端情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出来展示您期望发生的情况,无论是在正常情况下,还是在所有异常情况、极端情况、特殊情况、边界情况和边缘情况下?请同时确保提供minimal reproducible example

标签: scala loops dictionary


【解决方案1】:

如果这是您的目标:

List(List(r1), List(r2), List(r3 chain, r4), List(r5 chain, r6 chain, r7))

那么这是一种可能性:

val rules = List("r1", "r2", "r3 chain", "r4", "r5 chain", "r6 chain", "r7")

val (groups, last) = rules.foldLeft(List[List[String]](), List[String]()) {
  case ((groups, curGroup), rule) if rule.contains("chain") =>
    (groups, rule :: curGroup)
  case ((groups, Nil), rule) =>
    (List(rule) :: groups, Nil)
  case ((groups, curGroup), rule) =>
    ((rule :: curGroup).reverse :: groups, Nil)
}

val finalGroups = last match {
  case Nil  => groups
  case list => list.reverse :: groups
}

finalGroups.reverse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2021-11-26
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多