Scala中的List或ListBuffer的添加元素的方式
ArrayBuffer[Int]不是基本变量,因此向一个List或ListBuffer对象中添加一个ArrayBuffer[Int]的方式是地址添加,而不是值添加。因此,必须每次循环都重新创建变量(重新申请地址)
请看如下两个例子:
例1正确做法
// 顶点
val vertexArray = Array(
(1L,("Alice", 38)),
(2L,("Henry", 27)),
(3L,("Charlie", 55)),
(4L,("Peter", 32)),
(5L,("Mike", 35)),
(6L,("Kate", 23))
)
// 边
val edgeArray = Array(
Edge(2L, 1L, 5),
Edge(2L, 4L, 2),
Edge(3L, 2L, 7),
Edge(3L, 6L, 3),
Edge(4L, 1L, 1),
Edge(5L, 2L, 3),
Edge(5L, 3L, 8),
Edge(5L, 6L, 8)
)
//构造vertexRDD和edgeRDD
val vertexRDD:RDD[(Long,(String,Int))] = sc.parallelize(vertexArray)
val edgeRDD:RDD[Edge[Int]] = sc.parallelize(edgeArray)
// 构造图
val graph:Graph[(String,Int),Int] = Graph(vertexRDD, edgeRDD)
//按照顶之间的相邻关系构造邻接矩阵
val m1 = DenseMatrix.zeros[Int](vertexArray.length,vertexArray.length)
for (i<-edgeArray){
m1((i.srcId-1).toInt,(i.dstId-1).toInt)=1
}
//输出邻接矩阵
println("输出邻接矩阵")
for (i<-0 until m1.rows){//m1.rows是m1矩阵的行数,行号和列号都是从0开始的
println(m1(i,::))
}
//新建一个Seq
val seq1=new ListBuffer[ArrayBuffer[Int]]()
//提取列向量
for(i<-0 until m1.cols){
var ArrayCols=new ArrayBuffer[Int]()//scala中必须每次循环重新创建变量再添加到list中,否则会导致覆盖添加
for (j<-0 until m1.rows){
ArrayCols.append(m1(i,j))
}
println(ArrayCols)
seq1+=ArrayCols
println(seq1)
}
结果为
例2错误做法
//新建一个Seq
val seq1=new ListBuffer[ArrayBuffer[Int]]()
var ArrayCols=new ArrayBuffer[Int]()
//提取列向量
for(i<-0 until m1.cols){
//var ArrayCols=new ArrayBuffer[Int]()//scala中必须每次循环重新创建变量再添加到list中,否则会导致覆盖添加
ArrayCols.clear()
for (j<-0 until m1.rows){
ArrayCols.append(m1(i,j))
}
println(ArrayCols)
seq1+=ArrayCols
println(seq1)
}
结果为