ArrayList 和 Tuple 的 scala 版本是什么?



我正在尝试转换以下代码段

public org.apache.spark.mllib.linalg.Vector call(Tuple2<IntWritable, VectorWritable> arg0)
throws Exception {
org.apache.mahout.math.Vector mahoutVector = arg0._2.get();
Iterator<Element> elements = mahoutVector.nonZeroes().iterator();
ArrayList<Tuple2<Integer, Double>> tupleList = new ArrayList<Tuple2<Integer, Double>>();
while (elements.hasNext()) {
Element e = elements.next();
if (e.index() >= nCols || e.get() == 0)
continue;
Tuple2<Integer, Double> tuple = new Tuple2<Integer, Double>(e.index(), e.get());
tupleList.add(tuple);
}
org.apache.spark.mllib.linalg.Vector sparkVector = Vectors.sparse(nCols, tupleList);
return sparkVector;
}

我对 scala 相当陌生,所以我不知道如何正确转换它。到目前为止,我得到了

def transformSvec(x: Vector) : org.apache.spark.mllib.linalg.Vector = {
val iter=x.nonZeroes.iterator()    
//iterate the items and add to an arraylist
//or an iterable/seq for scala, if var seq: Seq[(Int, scala.Double)] is chosen then
org.apache.spark.mllib.linalg.Vectors.sparse(x.size, seq)
} 

有人可以帮忙吗?提前谢谢。

元组来自Scala,而不是Java。 在 Scala 中,您可以使用正确的语法(IntWritable, VectorWriteable)尽管这是针对类型的特殊语法Tuple2[IntWriteable, VectorWriteable]

您还可以使用此语法实例化元组。您的 Java 代码

Tuple2<Integer, Double> tuple = new Tuple2<Integer, Double>(e.index(), e.get());

成为

val tuple = (e.index(), e.get())

如果你愿意,你可以使用Scala的ArrayList,没有什么能阻止你,但通常更喜欢使用Scala集合,因为它们具有更多的功能,可以更好地与Scala的其余部分一起工作。scala.collection.mutable.ArrayBufferScala 相当于java.util.ArrayList

但是,在 Scala 中,像在 Java 中那样在循环中向集合中添加内容并不常见。 通常你会使用不可变的集合和方法(如mapflatmapfilter(来转换和生成新的集合。 在您的情况下,您可以使用

val tupleList = x.nonZeroes.iterator()
.filter(e => e.index < ncols)
.filter(e => e.get != 0)
.map(e => (e.index(), e.get))
.toSeq

生成序列。

在 Mahout 0.13.0 中,您还可以使用MahoutCollections

import org.apache.mahout.math.scalabindings.MahoutCollections._
val a = Array(1.0, 2.0, 3.0)
val v: Vector = new org.apache.mahout.math.DenseVector(a)
v.toArray

您可以将数组传递给 Spark 矢量的构造函数

最新更新