首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SortedSet折叠型失配

SortedSet折叠型失配
EN

Stack Overflow用户
提问于 2020-10-09 05:47:37
回答 2查看 56关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
def distinct(seq: Seq[Int]): Seq[Int] =
  seq.fold(SortedSet[Int]()) ((acc, i) => acc + i)

我想在seq上迭代,删除重复项(保留第一个数字),并保持数字的顺序。我的想法是使用SortedSet作为acc。

但我得到了:

类型错配: 所需:字符串 发现:任何

如何解决这个问题?(我也不知道如何在最后一次迭代中将SortedSet转换为Seq,因为我希望distinct返回seq)

附注:不使用标准seq distinct方法

在线代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-09 06:25:18

在您的情况下,如果您试图积累与容器(SortedSet != Int)不同类型的东西,则不应该使用Int。看签名fold

代码语言:javascript
复制
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1

它采用A1类型的累加器和结合两个A1元素的组合函数(A1, A1) => A1

在您的情况下,最好使用foldLeft,它采用与容器不同类型的累加器:

代码语言:javascript
复制
def foldLeft[B](z: B)(op: (B, A) => B): B

它利用种子B和从BAB的组合器积累了一定的B值。

在您的示例中,我希望使用LinkedHashSet --它保持添加元素的顺序,并删除重复项,请参阅:

代码语言:javascript
复制
import scala.collection.mutable

def distinct(seq: Seq[Int]): Seq[Int] = {
  seq.foldLeft(mutable.LinkedHashSet.empty[Int])(_ + _).toSeq
}
distinct(Seq(7, 2, 4, 2, 3, 0)) // ArrayBuffer(7, 2, 4, 3, 0)
distinct(Seq(0, 0, 0, 0)) // ArrayBuffer(0)
distinct(Seq(1, 5, 2, 7)) // ArrayBuffer(1, 5, 2, 7)

折叠后只需使用toSeq

小心点,lambda _ + _只是组合器的语法糖:

代码语言:javascript
复制
(linkedSet, nextElement) => linkedSet + nextElement
票数 2
EN

Stack Overflow用户

发布于 2020-10-09 13:44:00

我只想在你的Seq上打电话给Seq。您可以在SeqLike的源代码中看到,distinct将只遍历Seq和跳过已经看到的数据:

代码语言:javascript
复制
  def distinct: Repr = {
    val b = newBuilder
    val seen = mutable.HashSet[A]()
    for (x <- this) {
      if (!seen(x)) {
        b += x
        seen += x
      }
    }
    b.result
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64274565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档