代码之家  ›  专栏  ›  技术社区  ›  Alejandro Alcalde

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

  •  0
  • Alejandro Alcalde  · 技术社区  · 7 年前

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

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

    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 做

    3 回复  |  直到 7 年前
        1
  •  2
  •   BlueSheepToken    7 年前

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

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

    https://scalafiddle.io/sf/YbureiX/0

    不过,我不确定效率如何

        2
  •  2
  •   marstran    7 年前

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

    a 曾经 force 被称为。

        3
  •  0
  •   mukesh210    7 年前

    您可以通过使用 withFilter ,也可以将列表转换为向量,以在固定时间内提取特定索引处的元素:

      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)
    
    推荐文章