Scala:删除对象列表中的重复项

2023-11-27

我有一个对象列表List[Object]它们都是从同一个类实例化的。这个类有一个必须是唯一的字段Object.property。迭代对象列表并删除具有相同属性的所有对象(但第一个)的最干净的方法是什么?


list.groupBy(_.property).map(_._2.head)

说明: groupBy 方法接受将元素转换为用于分组的键的函数。_.property只是简写elem: Object => elem.property(编译器生成一个唯一的名称,例如x$1)。现在我们有了一张地图Map[Property, List[Object]]. A Map[K,V]延伸Traversable[(K,V)]。所以它可以像列表一样被遍历,但是元素是一个元组。这和Java的类似Map#entrySet()。 map 方法通过迭代每个元素并向其应用函数来创建新集合。在这种情况下,函数是_._2.head这是简写elem: (Property, List[Object]) => elem._2.head. _2只是 Tuple 的一个方法,返回第二个元素。第二个元素是 List[Object] 和head返回第一个元素

要使结果成为您想要的类型:

import collection.breakOut
val l2: List[Object] = list.groupBy(_.property).map(_._2.head)(breakOut)

简单解释一下,map实际上需要两个参数,一个函数和一个用于构造结果的对象。在第一个代码片段中,您看不到第二个值,因为它被标记为隐式,因此由编译器从范围内的预定义值列表中提供。结果通常是从映射的容器中获取的。这通常是一件好事。 List 上的映射将返回 List,Array 上的映射将返回 Array 等。但是在这种情况下,我们希望将我们想要的容器表示为结果。这就是使用breakOut方法的地方。它仅通过查看所需的结果类型来构造构建器(构建结果的事物)。它是一个泛型方法,编译器会推断出它的泛型类型,因为我们显式地将 l2 键入为List[Object]或者,为了保持秩序(假设Object#property属于类型Property):

list.foldRight((List[Object](), Set[Property]())) {
  case (o, cum@(objects, props)) => 
    if (props(o.property)) cum else (o :: objects, props + o.property))
}._1

foldRight是一个接受初始结果的方法和一个接受元素并返回更新结果的函数。该方法迭代每个元素,根据将函数应用于每个元素来更新结果并返回最终结果。我们从右到左(而不是从左到右)foldLeft)因为我们正在准备objects- 这是 O(1),但追加是 O(N)。还要观察这里的良好样式,我们使用模式匹配来提取元素。

在这种情况下,初始结果是空列表和集合的一对(元组)。该列表是我们感兴趣的结果,该集合用于跟踪我们已经遇到的属性。在每次迭代中,我们检查集合是否props已经包含该属性(在 Scala 中,obj(x)被翻译成obj.apply(x). In Set, 方法apply is def apply(a: A): Boolean。也就是说,接受一个元素并返回 true / false(如果存在或不存在)。如果该属性存在(已经遇到),则按原样返回结果。否则结果将被更新以包含对象 (o :: objects)并且财产被记录(props + o.property)

更新:@andreypopp 想要一个通用方法:

import scala.collection.IterableLike
import scala.collection.generic.CanBuildFrom

class RichCollection[A, Repr](xs: IterableLike[A, Repr]){
  def distinctBy[B, That](f: A => B)(implicit cbf: CanBuildFrom[Repr, A, That]) = {
    val builder = cbf(xs.repr)
    val i = xs.iterator
    var set = Set[B]()
    while (i.hasNext) {
      val o = i.next
      val b = f(o)
      if (!set(b)) {
        set += b
        builder += o
      }
    }
    builder.result
  }
}

implicit def toRich[A, Repr](xs: IterableLike[A, Repr]) = new RichCollection(xs)

to use:

scala> list.distinctBy(_.property)
res7: List[Obj] = List(Obj(1), Obj(2), Obj(3))

另请注意,这非常有效,因为我们使用的是构建器。如果您有非常大的列表,您可能需要使用可变的 HashSet 而不是常规集合并对性能进行基准测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:删除对象列表中的重复项 的相关文章

  • 在 R 中垂直绘制表 kable::extra 和 kable 的列表?

    我需要绘制表格列表一个在另一个之下 显示垂直 有任何想法吗 问题从这里开始 https stackoverflow com questions 73867229 plot a list of tables in a single table
  • 新式(“内联”)宏需要 scala.meta

    我刚刚更新到 scala meta 2 0 0 M1 和最新的 scala 2 12 3 现在宏不再编译 我所做的唯一更改是将元版本从 1 8 0 更改为 2 0 0 M1 错误 新式 内联 宏需要 scala meta 有谁知道是否有快速
  • 在Python中将字符串转换为字典或列表?

    在Python中将此字符串转换为列表或字典 u f i r s t n a m e u j o h n u l a s t n a m e u s m i t h u a g e 2 0 u m o b
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • 如何显示在 Emacs 中 hippie-expand 命令创建的所有可能的补全?

    我想列出所有项目hippie expand创建 然后通过移动光标并按 RET 键从中进行选择 有什么办法可以做到这一点吗 这是我为此目的使用的 global set key kbd M i complete with helm requir
  • 如何发现 Scala 远程 Actor 已死亡?

    在 Scala 中 当另一个 远程 actor 终止时 可以通过设置 trapExit 标志并以第二个 actor 作为参数调用 link 方法来通知一个 actor 在这种情况下 当远程参与者通过调用 exit 结束其工作时 第一个参与者
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • 互补DNA序列

    我在编写这个循环时遇到问题 它似乎在第二个序列之后停止了 我想返回给定 DNA 序列的互补 DNA 序列 例如 AGATTC gt TCTAAG 其中 A T 和 C G def get complementary sequence dna
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr
  • Scala:如何在超类上实现克隆方法,并在子类中使用它?

    我可能会以错误的方式处理这个问题 但我想要一个像这样的对象 class MyDataStructure def myClone val clone new MyDataStructure do stuff to make clone the
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF

随机推荐

  • Android OpenGL ES Framebuffer 对象 - 将深度缓冲区渲染到纹理

    我使用的 Android 设备运行 Froyo 支持 OpenGL ES 1 1 和 OpenGL ES 2 0 我想将深度缓冲区渲染为纹理 在看过其他平台 包括 iPhone 上的 OpenGL OpenGL ES 的许多示例后 我尝试了
  • AJAX 文件上传/表单提交无需 jquery 或 iframe?

    是否可以在没有 jQuery 或 IFrames 的情况下进行 AJAX 表单提交 因此只需纯 JavaScript 我目前正在发送到一个可以工作的struts fileUploadAction 该操作的代码是否仍适用于异步提交 或者是否需
  • 我可以在 iOS 上将 HTTP 缓存与 NSURLSessionDownloadTask 一起使用吗?

    我正在尝试使用NSURLSessionDownloadTask 并利用 Apple 内置的 URL 缓存功能 我已经成功地让缓存在使用时起作用NSURLSessionDataTask使用下面的代码 void downloadUsingNSU
  • Haskell 管道和分支

    Problem 我正在尝试使用 Haskell 和 Pipes 库实现一个简单的 Web 服务器 我现在明白循环或菱形拓扑对于管道是不可能的 但我认为我正在尝试这样做 我想要的拓扑结构是 GET gt handleGET gt gt pac
  • 即使在deleteLocalRef之后jni表也会溢出

    当我运行代码时 出现错误 无法添加到 JNI 本地引用表有 512 个条目 这是我的代码 jstring pJNIData pJNIEnv gt NewStringUTF variables 0 GetStringValue pJNIEnv
  • 如何使用自托管 ServiceStack 忽略路由

    我目前正在开发一个解决方案 我们有一个正在运行的自托管 ServiceStack 层 但问题是当我从浏览器访问它并且浏览器尝试获取网站图标时 我不断收到错误 据我所知 在运行自托管时没有忽略特定路由的选项吗 我会想象类似的事情 Routes
  • 如何使用 python 替换/删除 pdf 中的文本? [复制]

    这个问题在这里已经有答案了 我有隐藏 pdf 部分的代码 只需用白色多边形覆盖它 但问题是 文本仍然是there 如果你按 ctrl f 仍然可以找到它 我的目标是实际从 pdf 本身中删除文本 使用 pdfminer 我设法从 pdf 中
  • 为什么 App_Offline 一旦开始加载 dll 就无法工作?

    有人可以帮我解决这个问题吗 在生产站点上 app offline htm 仅在您开始上传 dll 之前有效 一旦您开始上传 dll 它就会抛出以下错误 无法加载文件或程序集 SubSonic 或其依赖项之一 该进程无法访问该文件 因为该文件
  • 关于使用 tf.image.crop_and_resize

    我正在研究适用于 fast rcnn 的 ROI 池化层 并且我习惯使用张量流 我发现tf image crop and resize可以充当 ROI 池化层 但我尝试了很多次都无法得到我期望的结果 或者真正的结果正是我得到的吗 这是我的代
  • sprintf 何时以及为何会失败?

    我正在使用 swprintf 将字符串构建到缓冲区中 使用循环等 const int MaxStringLengthPerCharacter 10 1 wchar t pTmp pBuffer for size t i 0 i lt nNu
  • Java 中的 HTTP URL 地址编码

    我的 Java 独立应用程序从用户那里获取一个 URL 指向一个文件 我需要点击它并下载它 我面临的问题是我无法正确编码 HTTP URL 地址 例子 URL http search barnesandnoble com booksearc
  • 在 JavaFx 中从输入流播放 mp3 文件

    我正在使用 JavaFX 媒体播放器使用以下代码播放 mp3 文件 new MediaPlayer new Media FileObject toURI toString play 但是现在我需要在内存中保存 mp3 字节数据而不是文件对象
  • 强制浏览器使用新的 CSS

    有没有办法检查用户的浏览器是否缓存了不同版本的 CSS 如果是 则强制他们的浏览器提取新版本 我不知道这是否是正确的用法 但我认为您可以使用查询字符串强制重新加载 css 文件 我记得几年前我使用过这种方法来强制重新加载网络摄像头图像 但时
  • 编译器之间的 Dll 兼容性

    有没有办法让不同编译器构建的 c dll 相互兼容 这些类可以具有用于创建和销毁的工厂方法 因此每个编译器都可以使用自己的 new delete 因为不同的运行时有自己的堆 我尝试了以下代码 但它在第一个成员方法上崩溃了 接口 h prag
  • Composer 给出错误,“未找到类”

    我使用的是 Windows 10 创建文件夹后src在根目录中我创建了两个文件 目录结构 运行前composer install composer json run php src childclass php parentclass ph
  • 我怎样才能过渡高度:0;高度:自动;使用CSS?

    我正在尝试做一个 ul 使用 CSS 过渡向下滑动 The ul 开始于height 0 悬停时 高度设置为height auto 然而 这导致它简单地出现 not过渡 如果我从height 40px to height auto 然后它会
  • jQuery:强制显示修改后的dom

    我在尝试在页面上设置一个 加载微调器 时遇到了一个问题 该微调器在对表进行排序时运行 特别是对于速度较慢的客户端 因为对页面进行排序可能需要长达 10 秒的时间 我可以看到 DOM 被微调器代码修改 但它不显示 我希望在排序发生之前我可以做
  • C# 将对象写入二进制文件

    我必须将一个对象写入二进制文件 我的结构如下所示 Struct Company int numberofemployees list of Struct Employee Struct Employee string EmployeeNam
  • 通过 Applescript 添加文件到 Xcode 项目目标

    我想将文件自动添加到从头开始创建的 Xcode 项目 通过另一个 IDE 作为构建后步骤 我们的项目设置为调用一个 applescript 该 applescript 在项目中进行适当的文件引用 但每次尝试将文件引用添加到项目都会失败 核心
  • Scala:删除对象列表中的重复项

    我有一个对象列表List Object 它们都是从同一个类实例化的 这个类有一个必须是唯一的字段Object property 迭代对象列表并删除具有相同属性的所有对象 但第一个 的最干净的方法是什么 list groupBy proper