Scala 基于索引高效地筛选列表中的元素

Scala 基于索引高效地筛选列表中的元素,scala,Scala,我正在做一个练习,要求删除奇数位置的元素 我想知道是否有一个最好的选择来代替我的想法: val a = List(1,2,3,4,5,6) 第一种方法: a.zipWithIndex.filter(x => (x._2 & 1) == 1).map(_._1) 第二点: a.indices.filter(i => (i & 1) == 1).map(a(_)) 如果我认为第二种方法更有效,我对吗?由于不必像zipWithIndex那样生成中间列表,您可以通过使

我正在做一个练习,要求删除奇数位置的元素

我想知道是否有一个最好的选择来代替我的想法:

val a  = List(1,2,3,4,5,6)
第一种方法:

a.zipWithIndex.filter(x => (x._2 & 1) == 1).map(_._1)
第二点:

a.indices.filter(i => (i & 1) == 1).map(a(_))

如果我认为第二种方法更有效,我对吗?由于不必像zipWithIndex那样生成中间列表,

您可以通过使用带过滤器的
避免中间集合的形成,您还可以将列表转换为向量,以在恒定时间内提取特定索引处的元素:

  val a: Vector[Int] = List(1,2,3,4,5,6).toVector
  val res: Seq[Int] = a.indices.withFilter(i => (i & 1) == 1).map(a(_))
  println(res)

通过使用
with filter
,您可以避免形成中间集合,还可以将列表转换为向量,以在固定时间内提取特定索引处的元素:

  val a: Vector[Int] = List(1,2,3,4,5,6).toVector
  val res: Seq[Int] = a.indices.withFilter(i => (i & 1) == 1).map(a(_))
  println(res)

您可以使用压缩列表上的
collect
方法,可能会更清楚一些

a.zipWithIndex.collect{
  case (x,i) if i % 2 == 1 => x
}


我不确定效率,尽管你可以在压缩列表中使用
收集
方法,可能会更清楚一些

a.zipWithIndex.collect{
  case (x,i) if i % 2 == 1 => x
}


我不确定效率,但您可以使用视图来避免中间列表:

a.view
 .zipWithIndex
 .filter(x => (x._2 & 1) == 1)
 .map(_._1)
 .force

调用
force
时,这只会遍历
a
一次。

您可以使用视图来避免中间列表:

a.view
 .zipWithIndex
 .filter(x => (x._2 & 1) == 1)
 .map(_._1)
 .force

当调用
force
时,这只会遍历
a
一次。

我建议相反。索引
列表
,即
a()
,对于长列表来说是一种效率低下的线性操作。要避免。我建议相反。索引
列表
,即
a()
,对于长列表来说是一种效率低下的线性操作。要避免。将列表转换为
向量
并不是在固定时间内完成的。但是访问元素将在固定时间
a。索引
在固定时间内运行(它的定义是
0,直到长度
)。而
a.toVector.index
将以线性时间运行,因为它必须将所有元素复制到一个新的
Vector
。将
列表
转换为
向量
没有意义。但是,将列表转换为
向量
并不是在固定时间内完成的。但是,访问元素将在固定时间
a。索引
在固定时间内运行(它的定义是
0,直到长度
)。而
a.toVector.index
将以线性时间运行,因为它必须将所有元素复制到一个新的
Vector
。将
列表
转换为
向量
没有意义。