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