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

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

结果为
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值