Scala中的List或ListBuffer的添加元素的方式
不論你是使用List還是使用ListBuffer,向一個List或ListBuffer對象中添加新的元素的方式是地址添加,而不是值添加。因此,必須每次循環都重新創建變量(重新申請地址)
請看如下兩個例子:
例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)
}
結果爲