Scala中的List或ListBuffer的添加元素的方式

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

結果爲
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章