这样做是可行的:
import scala.collection.mutable.ArrayBuffer
case class Z (a1:String, b1:String, ts1: Integer)
var d = new ArrayBuffer[Z]() // empty buffer is created
d = ArrayBuffer(Z("Mark", "Hamlin", 2), Z("Kumar", "XYZ", 3), Z("Tom", "Poolsoft", 4))
//val g = d1.map(x => (x.a1, x.b1, x.ts1))
var Z1 = new ArrayBuffer[Z]()
for (x <- d) {
Z1 += Z(x.a1, x.b1, x.ts1)
}
println(Z1) 我如何在循环中克隆Z的条目而不必指定case类Z的所有字段名?Z(x.a1, x.b1, x.ts1)看不到这一点。我想单独做这件事是有原因的。
copyToArray和克隆人似乎不在这里。如果我也能用一个尺寸的话,我会很高兴的,但是我对这个主要的问题很感兴趣。
我看了这个scala ArrayBuffer remove all elements with a predicat,但是我没有过滤器可以使用。我需要,比方说,首先要复制N。
发布于 2022-08-14 20:37:52
回答“如何在循环中克隆Z的条目而不必指定case类Z的所有字段名?”:
如果您真的想为每个Z创建一个新实例,您可以这样做:
for (x <- d) {
Z1 += x.copy()
}但是:当然,你不需要这样做。您的Z-objects在ArrayBuffer中是不可变的,因此没有理由复制它们(没有人可以修改它们.)。相反,只需将相同的实例添加到复制的缓冲区中:
for (x <- d) {
Z1 += x
}因为每个x都是不可变的,所以不应该有区别(但是第二个选项为垃圾收集器节省了一些工作,因为分配的对象较少)。
发布于 2022-08-15 10:31:56
不要使用vars、可变集合和数组。这不是用scala编写代码的方式。也要避免过程循环。
val d = Seq(Z("Mark", "Hamlin", 2), Z("Kumar", "XYZ", 3), Z("Tom", "Poolsoft", 4))
val d1 = d.take(2) // copies first two elements from d to d1
val d2 = d.drop(2) // removes first two elements from d and assigns the rest to d2
// or do both take and drop at once:
val (d1, d2) = d.splitAt(2)https://stackoverflow.com/questions/73354466
复制相似问题