【问题标题】:How to remove an item from a list in Scala having only its index?如何从只有索引的Scala列表中删除一个项目?
【发布时间】:2013-09-17 10:21:42
【问题描述】:

我有一个清单如下:

val internalIdList: List[Int] = List()

internalIdList = List(11, 12, 13, 14, 15)

从这个列表中移除第三个元素以获得:

internalIdList = List(11, 12, 14, 15)

我不能使用ListBuffer,有义务维护现有的结构。 我该怎么办?

谢谢大家

【问题讨论】:

    标签: list scala filter scala-2.10


    【解决方案1】:

    Seq 上有一个 .patch 方法,因此要删除第三个元素,您只需这样做:

    List(11, 12, 13, 14, 15).patch(2, Nil, 1)
    

    其中说:从索引 2 开始,请移除 1 元素,并将其替换为 Nil

    深入了解这种方法可以让您做的远不止这些。您可以将列表的任何子列表替换为任意其他列表。

    【讨论】:

      【解决方案2】:

      简单使用

      val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
      

      如果索引大于列表的大小,这也将起作用(它将返回相同的列表)。

      【讨论】:

      • if/else 没用:如果给定索引大于大小,则 take 和 drop 将按预期运行。
      【解决方案3】:

      一种惯用的方法是使用索引压缩值,过滤,然后再次投影值:

      scala> List(11,12,13,14,15).zipWithIndex.filter(_._2 != 2).map(_._1)
      res0: List[Int] = List(11, 12, 14, 15)
      

      但你也可以使用splitAt:

      scala> val (x,y) = List(11,12,13,14,15).splitAt(2)
      x: List[Int] = List(11, 12)
      y: List[Int] = List(13, 14, 15)
      
      scala> x ++ y.tail
      res5: List[Int] = List(11, 12, 14, 15)
      

      【讨论】:

        【解决方案4】:

        如果你坚持使用oldschool方法,请使用collect:

        List(1,2,3,4).zipWithIndex.collect { case (a, i) if i != 2 => a }
        

        但是,我仍然更喜欢我其他答案中的方法。

        【讨论】:

        • 这太棒了!
        • 很高兴你喜欢它,不过,我建议我的 .patch() 答案。 ;)
        【解决方案5】:
        (internalIdList.indices.collect { case i if i != 3 => internalList(i) }).toList
        

        概括一下...

        def removeIndex[A](s: Seq[A], n: Int): Seq[A] = s.indices.collect { case i if i != n => s(i) }
        

        虽然这通常会返回一个向量,但你需要这样做

        val otherList = removeIndex(internalIdList, 3).toList
        

        如果你真的想要一份清单。

        Shadowlands 有一个解决方案,倾向于对于线性序列更快。这个使用索引序列会更快。

        【讨论】:

          【解决方案6】:

          实现 Nicolas 的第一个解决方案的通用函数:

          def dropIndex[T](list: List[T], idx: Int): List[T] =
            list.zipWithIndex.filter(_._2 != idx).map(_._1)
          

          用法:

          scala> val letters = List('a', 'b', 'c')
          scala> for (i <- 0 until letters.length) println(dropIndex(letters, i))
          List(b, c)
          List(a, c)
          List(a, b)
          

          【讨论】:

            【解决方案7】:

            像这样在列表xs 上使用 for 理解,

            for (i <- 0 until xs.size if i != nth-1) yield xs(i)
            

            还要考虑一组排除索引,例如val excl = Set(2,4) 用于排除第二项和第四项;因此我们收集那些索引不属于排除集的项目,即

            for (i <- 0 until xs.size if !excl(i)) yield xs(i)
            

            【讨论】:

              猜你喜欢
              • 2020-03-15
              • 2011-05-24
              • 2020-09-24
              • 1970-01-01
              • 1970-01-01
              • 2020-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多