代码之家  ›  专栏  ›  技术社区  ›  4e6

交换列表中x元素的正确方法

  •  1
  • 4e6  · 技术社区  · 16 年前

    我开始学习Scala语言,我有一个问题。您认为,以函数样式交换列表中的第一个和最后一个x元素是一种正确的方法吗?

    def swap(l: List[Any], x: Int) = {
      val l1 = l.take(x)
      val l2 = l.slice(x, l.length - x)
      val l3 = l.takeRight(x)
      l3 ::: l2 ::: l1
    }
    

    如果x超过列表长度的一半,发生什么都不重要。我对找出算法很感兴趣。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Rex Kerr    16 年前

    此代码是正确的,并且具有合理的功能样式。它不是最有效的,因为它必须遍历列表四次才能创建片段 l1 通过 l3 . 另外,您可能希望保留列表包含的类型,因此有一点改进:

    def swap[A](l: List[A], x: Int) = {
      val (l1,rest) = l.splitAt(x)
      val (l2,l3) = rest.splitAt(rest.length-x)
      l3 ::: l2 ::: l1
    }
    
        2
  •  2
  •   olle kullberg    16 年前

    我试过了,效果很好:

    scala> swap(List(1, 2, 3, 4, 5),2)
    res0: List[Any] = List(4, 5, 3, 1, 2)
    

    你自己提供的代码有什么问题吗?

    推荐文章