Java 什么是scala';ArrayList和Tuple的s版本?

Java 什么是scala';ArrayList和Tuple的s版本?,java,scala,Java,Scala,我正在尝试转换以下代码段 public org.apache.spark.mllib.linalg.Vector call(Tuple2<IntWritable, VectorWritable> arg0) throws Exception { org.apache.mahout.math.Vector mahoutVector = arg0._2.get();

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

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;
                }

有人能帮忙吗?提前感谢。

Tuple来自Scala,而不是Java。在Scala中,您可以使用正确的语法,尽管
(IntWriteable,VectorWriteable)
是类型
Tuple2[IntWriteable,VectorWriteable]

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

 Tuple2<Integer, Double> tuple = new Tuple2<Integer, Double>(e.index(), e.get());
如果愿意,您可以使用Scala中的ArrayList,没有什么可以阻止您,但通常更倾向于使用Scala集合,因为它们有更多的功能,可以更好地与Scala的其余部分配合使用
scala.collection.mutable.ArrayBuffer
是scala等价于
java.util.ArrayList

然而,在Scala中,向循环中的集合中添加东西并不像在Java中那样常见。通常,您会使用不可变的集合和方法,如
map
flatmap
filter
来转换和生成新集合。在你的情况下,你可以使用

val tupleList = x.nonZeroes.iterator()
  .filter(e => e.index < ncols)
  .filter(e => e.get != 0)
  .map(e => (e.index(), e.get))
  .toSeq
val tupleList=x.nonZeroes.iterator()
.filter(e=>e.indexe.get!=0)
.map(e=>(e.index(),e.get))
托塞克先生

生成序列。

在Mahout 0.13.0中,您还可以使用
Mahout集合

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向量的构造函数,它会抛出以下错误:“值筛选器不是java.util.Iterator[org.apache.mahout.math.Vector.Element]的成员”@user3086871如果您有java迭代器,则需要先将其转换为Scala迭代器,
import scala.collection.JavaConverters.\u
通过该导入,您可以在迭代器中调用
.asScala
,将其转换为scala迭代器。这是使用Mahout的首选方法。
val tupleList = x.nonZeroes.iterator()
  .filter(e => e.index < ncols)
  .filter(e => e.get != 0)
  .map(e => (e.index(), e.get))
  .toSeq
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