更干净的元组 groupBy

2024-01-11

我有一系列键值对(String、Int),我想按键将它们分组为值序列(即Seq[(String, Int)]) => Map[String, Iterable[Int]])).

明显地,toMap在这里没有用,并且groupBy将值维护为元组。我想出的最好的办法是:

val seq: Seq[( String, Int )]
// ...
seq.groupBy( _._1 ).mapValues( _.map( _._2 ) )

有没有更干净的方法来做到这一点?


这是一个皮条客,添加了一个toMultiMap可遍历的方法。它能解决你的问题吗?

import collection._
import mutable.Builder
import generic.CanBuildFrom

class TraversableOnceExt[CC, A](coll: CC, asTraversable: CC => TraversableOnce[A]) {

  def toMultiMap[T, U, That](implicit ev: A <:< (T, U), cbf: CanBuildFrom[CC, U, That]): immutable.Map[T, That] =
    toMultiMapBy(ev)

  def toMultiMapBy[T, U, That](f: A => (T, U))(implicit cbf: CanBuildFrom[CC, U, That]): immutable.Map[T, That] = {
    val mutMap = mutable.Map.empty[T, mutable.Builder[U, That]]
    for (x <- asTraversable(coll)) {
      val (key, value) = f(x)
      val builder = mutMap.getOrElseUpdate(key, cbf(coll))
      builder += value
    }
    val mapBuilder = immutable.Map.newBuilder[T, That]
    for ((k, v) <- mutMap)
      mapBuilder += ((k, v.result))
    mapBuilder.result
  }
}

implicit def commomExtendTraversable[A, C[A] <: TraversableOnce[A]](coll: C[A]): TraversableOnceExt[C[A], A] =
  new TraversableOnceExt[C[A], A](coll, identity)

可以像这样使用:

val map = List(1 -> 'a', 1 -> 'à', 2 -> 'b').toMultiMap
println(map)  // Map(1 -> List(a, à), 2 -> List(b))

val byFirstLetter = Set("abc", "aeiou", "cdef").toMultiMapBy(elem => (elem.head, elem))
println(byFirstLetter) // Map(c -> Set(cdef), a -> Set(abc, aeiou))

如果添加以下隐式定义,它也适用于类似集合的对象,例如Strings and Arrays:

implicit def commomExtendStringTraversable(string: String): TraversableOnceExt[String, Char] =
  new TraversableOnceExt[String, Char](string, implicitly)

implicit def commomExtendArrayTraversable[A](array: Array[A]): TraversableOnceExt[Array[A], A] =
  new TraversableOnceExt[Array[A], A](array, implicitly)

Then:

val withArrays = Array(1 -> 'a', 1 -> 'à', 2 -> 'b').toMultiMap
println(withArrays) // Map(1 -> [C@377653ae, 2 -> [C@396fe0f4)

val byLowercaseCode = "Mama".toMultiMapBy(c => (c.toLower.toInt, c))
println(byLowercaseCode) // Map(97 -> aa, 109 -> Mm)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更干净的元组 groupBy 的相关文章

随机推荐

  • SimpleXML - 使用先前声明的命名空间添加新节点 - 如何?

    我想在一个非常具体的地方添加一个孩子 所以我也使用 DOM 而不仅仅是 simpleXML
  • HBASE SPARK 带过滤器的查询,无需加载所有 hbase

    我必须查询 HBASE 然后使用 Spark 和 scala 处理数据 我的问题是 通过我的解决方案 我获取 HBASE 表的所有数据 然后进行过滤 这不是一种有效的方法 因为它占用了太多内存 所以我想直接做过滤器 我该怎么做 def Hb
  • 如何在 Laravel 控制台上打印消息?

    运行 php artisanserve 时 laravel 如何在控制台上打印一些字符串 我试过Log info但它不起作用 这很简单 您可以在APP中的任何地方调用它 out new Symfony Component Console O
  • 想要在jsp页面中动态填充文本框

    想要使用 jsp 页面创建一个应用程序 以便它从文本框中的用户处获取一个值 并根据该值从数据库中检索其他值 并用检索到的值填充其他文本框 创建一个 HTML 表单并将其放入search jsp
  • GKE 对于小型 Node.js 应用程序 Pod 来说 CPU 不足

    所以在 GKE 上我有一个 Node jsapp每个 pod 使用以下内容 CPU cores 5m MEMORY 100Mi 但是我只能在每个节点部署 1 个 pod 我正在使用 GKEn1 standard 1簇有1 vCPU 3 75
  • 如何使用 GitHub 操作替换表达式中的字符串

    这是我返回的动作 TOXENV看起来像这样py3 6 django2 2我想 TOXENV看起来像这样py36 django22有没有我可以用来替换的替代 替换功能 char name CI on workflow dispatch bra
  • 如何计算spark中DataFrame中列的百分位数?

    我正在尝试计算 DataFrame 中列的百分位数 我在 Spark 聚合函数中找不到任何percentile approx 函数 例如在Hive中我们有percentile approx 我们可以通过以下方式使用它 hiveContext
  • 图像色彩饱和度

    我试图找到一种饱和函数形式 但没有找到任何东西 这不可能那么难 但我所有的猜测看起来都不太正确 去饱和的方向似乎更容易 我有 RGB 格式的图像像素数据 最终图像也应该是 RGB 格式 那么 这些函数是如何定义的 r n saturatio
  • AS3:文本字段焦点

    我正在尝试处理 TextField 上的焦点事件 以便在聚焦 选项卡或单击 时可以选择所有文本 看来我在这里做错了什么 txtTextField addEventListener FocusEvent FOCUS IN handleFocu
  • 将文本颜色和提示文本颜色设置为SearchView中的文本

    我想将文本颜色和提示文本颜色设置为 android support v7 widget SearchView 中的文本 该文本不在 ActionBar 中 也不在 Menu 选项中 我尝试了 stackoverflow 中提到的几种方法 但
  • 如何获取Linux上的非系统用户列表?

    考虑到所有用户id gt 1000是非系统用户 我们如何在单个命令中获取这些用户的列表 您需要获取所有用户gid大于或等于 1000 使用此命令 awk F 3 gt 1000 1 nobody print 1 etc passwd 如果你
  • Angular:vscode 中预期的表达式

    当我保存文件时 vscode 自动滚动到该随机行并指向 给出这个错误 我只是检查是否dateToComplete is null因为有时需要 我是否需要禁用 ts 的某些新功能 if this editMode this dateToCom
  • 为什么在 Selenium 中使用 add_experimental_option ?

    我试图理解与以下内容非常相似的代码片段 from selenium webdriver chrome options import Options chrome options Options port number 127 0 0 1 8
  • (Vue,ChartJS)从子组件画布上下文为图表创建渐变背景

    我想为我的图表提供渐变背景颜色 但我无法访问画布上下文 因为我的图表在我编写的包装器组件中呈现 What I want to achieve 我的实际包装看起来像这样
  • 使用 Java 解密由 .NET 的 RijndaelManaged 加密的字节

    我正在尝试解密一些东西 它是使用 NET C 的 RijndaelManaged 加密的 使用 Java 解密 C 程序不是我的 我无法将其更改为更具互操作性 但我知道它是如何加密的 byte bytes new UnicodeEncodi
  • 如何验证Java线程堆栈大小是否固定或有限?

    我试图验证 Java 堆栈大小是否固定 在开始时设置 或有限 增长到一定限制 我试图用一个简单的程序来测量这一点 该程序创建一定数量的线程 设置 Xss 但到目前为止我只发现 RSS 是每个进程的 并且出于明显的原因 知道堆大小在这里毫无意
  • Linq 完全外连接与数据表中的 NULL 记录 C#

    请问有人可以帮忙吗 我需要在 Extn In Call Records Extn Number 上返回一个表 如果任一侧不匹配 仍然返回一个计算 就像 SQL 完全外连接一样 我花了几个小时看这个 但无法让它工作 如果删除联合 我可以让代码
  • Monodroid - EditText 输入法不接受数字

    我在使用 Mono for Android 中的 EditText 控件时遇到一些非常奇怪的问题 我的解决方案针对的是 2 3 并且我正在 T Mobile VivaCity 上进行调试 这是我的 EditText 的 AXML
  • 如何阻止 git 在结账时破坏编码

    我最近使用以下设置将 gitattributes 文件添加到 c 存储库 text auto cs text diff csharp 我重新规范化了存储库按照 github 上的这些说明进行操作 https help github com
  • 更干净的元组 groupBy

    我有一系列键值对 String Int 我想按键将它们分组为值序列 即Seq String Int gt Map String Iterable Int 明显地 toMap在这里没有用 并且groupBy将值维护为元组 我想出的最好的办法是