列表中的scala重复元素

时间:2014-06-17 02:08:45

标签: scala list-comprehension

我需要复制列表中的每个元素。 以下是我提出的建议:

List.range(1,5).map(i => List(i,i)).flatten

输出

List[Int] = List(1, 1, 2, 2, 3, 3, 4, 4)

我想知道这是否是最有效的方法(最终需要运行大量数据),因为对于每个元素,都会创建一个新列表。

(以上是在int范围内,为了使示例简单)

有什么建议吗?

6 个答案:

答案 0 :(得分:4)

更通用的解决方案是:

def duplicate[T](list: List[T]): List[T] = list.flatMap(x => List[T](x, x))

使用不可变集合对于非常大的数据集来说不会有效。使用mutable ListBuffer的简单实现已经比上面快10倍(使用包含一百万个元素的列表):

def duplicate[T](list: List[T]): List[T] = {

    val buffer = collection.mutable.ListBuffer[T]()

    list.foreach{ x =>
        buffer += x
        buffer += x
    }

    buffer.toList
}

这使用了一种将ListBuffer附加到性能上的常规技术,然后在最后转换为不可变List

答案 1 :(得分:4)

你真的需要名单吗?你可以通过更通用的方式做得更好吗?当其他集合更适合时,列表经常被过度使用。这是一个接受任何Seq并创建一个重复项目的Stream的方法,Streams自然是懒惰的,你不一定会有创建和丢弃很多小列表的内存开销:

def dupe[A](as: Seq[A]): Stream[A] = as match { 
  case Seq(h, t @ _*) => h #:: h #:: dupe(t)
  case _ => Stream.empty 
}

我们可以看到它懒散地行动:

scala> dupe(List(1,2,3,4))
res1: Stream[Int] = Stream(1, ?)

懒得足以让它在很大甚至无限的输入下工作:

scala> dupe(Stream.range(1, Int.MaxValue)).take(10).force
res2: scala.collection.immutable.Stream[Int] = Stream(1, 1, 2, 2, 3, 3, 4, 4, 5, 5)

scala> dupe(Stream.continually(1)).take(10).force
res3: scala.collection.immutable.Stream[Int] = Stream(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

如果你真的想要一个清单:

scala> dupe(List(1,2,3,4)).toList
res5: List[Int] = List(1, 1, 2, 2, 3, 3, 4, 4)

答案 2 :(得分:2)

还有另一个版本

def dupe[T](xs:List[T]):List[T] = 
    xs.foldRight(List[T]()) {(elem, acc) => elem::elem::acc}

可能与地图一样高效,但在展平列表上保存了额外的迭代

答案 3 :(得分:2)

另一种解决方案:
参数时间表示您希望重复列表中每个元素的次数

def repeatElementsInList[T](list: List[T],times: Int): List[T] = {
       list.flatMap (x =>
         List.fill(times)(x)
       )
   }

scala> repeatElementInList(List("a",1,"b"),3)
res6: List[Any] = List(a, a, a, 1, 1, 1, b, b, b)

答案 4 :(得分:0)

根据上述评论,对于任何特定方法,例如f1(x: Int): Intf2(x: Int): Int,请考虑

(1 to 5).par.filter { x => f1(x) > f2(x) }

其中par将范围转换为并行集合,值得考虑大型集合。

答案 5 :(得分:0)

为什么不

var a = List("a","b","c")

val c = a ::: a

println(c)