gpt4 book ai didi

class - Scala:基于类型过滤

转载 作者:行者123 更新时间:2023-12-03 22:00:33 24 4
gpt4 key购买 nike

我正在学习 Scala,因为它非常适合我的需求,但我发现很难优雅地构建代码。我的情况是 List x并想创建两个 List s:包含SomeClass的所有元素的一个一个包含所有不属于 SomeClass 的元素.

val a = x collect {case y:SomeClass => y}
val b = x filterNot {_.isInstanceOf[SomeClass]}

现在我的代码看起来像那样。然而,它不是很有效,因为它迭代 x两次,代码不知何故似乎有点hackish。有没有更好(更优雅)的做事方式?

可以假设 SomeClass没有子类。

最佳答案

已编辑

使用普通时 partition是可能的,它会丢失 collect 保留的类型信息在问题中。

可以定义 partition 的变体使用 Either 接受返回两种类型之一的值的函数的方法:

import collection.mutable.ListBuffer

def partition[X,A,B](xs: List[X])(f: X=>Either[A,B]): (List[A],List[B]) = {
val as = new ListBuffer[A]
val bs = new ListBuffer[B]
for (x <- xs) {
f(x) match {
case Left(a) => as += a
case Right(b) => bs += b
}
}
(as.toList, bs.toList)
}

然后保留类型:
scala> partition(List(1,"two", 3)) {
case i: Int => Left(i)
case x => Right(x)
}

res5: (List[Int], List[Any]) = (List(1, 3),List(two))

当然,可以使用构建器和所有改进的集合来改进解决方案:)。

为了完整起见,我的 旧答案 使用普通 partition :
val (a,b) = x partition { _.isInstanceOf[SomeClass] }

例如:
scala> val x = List(1,2, "three")
x: List[Any] = List(1, 2, three)

scala> val (a,b) = x partition { _.isInstanceOf[Int] }
a: List[Any] = List(1, 2)
b: List[Any] = List(three)

关于class - Scala:基于类型过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3572195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com