1

我有如下代码

    val g = new Graph(vertices)

        //Firts part

        (1 to vertices).par.foreach( i => g + new Vertex(i))

       //Second part

          for (i <- 1 to edges) {
            val data = scala.io.StdIn.readLine()
            val d = data.split(" ")
            val v1 = d(0).toInt
            val v2 = d(1).toInt
            val length = d(2).toInt
            g+(v1, v2, length)
        }

我想按顺序执行第一部分和第二部分代码。目前 for 循环在所有 Vertex 都添加到 g 之前运行。在代码 +(加号)中定义将 Vertex 的新实例添加到 MutableList。

我是scala的新手,请帮忙

4

3 回答 3

0

并行集合仅并行化集合的计算。添加边的计算的第二部分应该在添加顶点之后发生。

我会假设可能是由于解析有一些顶点根本不存在于顶点中,可能是一些空白空间或类似的东西。

我不确定将顶点添加到图形时会发生什么,但是如果操作应该没有副作用,则并行的 foreach 应该小心。请参阅以获取更多信息。可能这甚至不相关。

于 2015-06-29T13:59:02.497 回答
0

您可以将每个调用包装在以下内容中

new Thread(new Runnable {
  override def run(): Unit = {
    //Code part here:
  }
}).start()

您还需要确保您的Graph实现是线程安全的,因为您将有两个线程同时修改它。

看起来你没有从任何部分返回任何东西,但如果你是,你可以使用 aFuture代替。有关详细信息,请参见此处

于 2015-06-29T14:17:38.720 回答
0

我找到了解决方案。我阅读了有关将新元素添加到并行集合的更多信息,它不是线程保存。我将 MutableList 替换为固定大小的数组,并按索引添加新元素。

下面的一些代码:

class Graph(val end: Int) {

  private val vertices : Array[Vertex] = new Array[Vertex](end)

  def +(index: Int, v: Vertex): Unit = {
    vertices(index) = v
  }  

  (...)
}

     //Firts part
      (1 to vertices).par.foreach( i => g + (i-1,new Vertex(i))) //add new vertex to array by index
于 2015-06-30T09:34:00.360 回答