1

これはコードです:

object Main {
def main(args: Array[String]){
  var myArray = Array(5,2,7,6,8,1,15,5/*,9,10,56*/)
  var startSorting = new Starter(myArray)
  startSorting.start
  startSorting ! Begin
  var i = 0
  for( i <- 0 to myArray.length - 1){
   println(myArray(i))
  }
}
 }

 import scala.actors.Actor
 import scala.actors.Actor._

 abstract class SortArray 
 case object Sort extends SortArray
 case object FinishedSubArraySorting extends SortArray
 case object Begin extends SortArray

 class Starter(toBeSorted :Array[Int]) extends Actor{
   def act(){
     var first:Array[Int] = Array()
     var second:Array[Int] = Array()
    loop{
      react{
    case Begin =>
      var SortActor = new MergeSort(toBeSorted)
      SortActor.start
      SortActor ! Sort
    case sortedArray :Array[Int] =>
         var i = 0
         println("Sortat:")
         for( i <- 0 to sortedArray.length - 1){
             println(sortedArray(i))
         }
      }
    }
   }
 }

 class MergeSort(toBeSorted :Array[Int]) extends Actor{
   def act(){
  var finishedSorting = 0
  var thisArray = toBeSorted
  var first:Array[Int] = Array();
  var second:Array[Int] = Array();
  var sortedSubArrays = 0;
  loop{
    react{
      case Sort =>
        if(thisArray.length == 1){
          finishedSorting = 1
          sender ! thisArray
          exit('stop)
        }else{
          first = thisArray.slice(0,thisArray.length/2)
          second = thisArray.slice(thisArray.length/2,thisArray.length)
          var firstSort = new MergeSort(first)
          var secondSort = new MergeSort(second)
          firstSort.start
          secondSort.start
          firstSort ! Sort
          secondSort ! Sort
        }
      case subSortedArray:Array[Int] =>
        sortedSubArrays = sortedSubArrays + 1
        if(sortedSubArrays == 1){
            first = subSortedArray
        }else{
          second = subSortedArray
          thisArray = merge(first,second)
          finishedSorting = 1
          sender ! thisArray
          exit('stop)
        }
    }
  }
   }
   def merge(firstArray :Array[Int],secondArray :Array[Int]):Array[Int] = {

var result:Array[Int] = new Array[Int](firstArray.length + secondArray.length)
var i = 0
var j = 0
var k = 0
while(i < firstArray.length && j < secondArray.length){
  if(firstArray(i) <= secondArray(j)){
    result(k) = firstArray(i)
    i = i + 1
  }else{
    result(k) = secondArray(j)
    j = j + 1
  }
  k = k + 1
}
while (i < firstArray.length)
{
    result(k) = firstArray(i)
    i = i + 1
    k = k + 1
}
while (j < secondArray.length)
{
    result(k) = secondArray(j)
    j = j + 1
    k = k + 1
}
return result
 }
}

2 つのアクターを使用します。1 つは最初と最後の出力用で、もう 1 つは配列とサブ配列をマージソートするために複数のインスタンスを持つ予定です。!Sort配列を 2 つに分割し、各 subArray に対して 2 つのアクターを作成するために、インスタンスが最初に呼び出されます。その後、前述の 2 つのアクターのそれぞれから結果として得られる並べ替えられたサブ配列を使用して呼び出されます。

このコードの問題は、最下位レベル (最大長 2 のサブ配列) でのみソートとマージを管理し、何らかの理由で、アクターが呼び出した送信者とは異なる送信者を呼び出すため、何も起こらないことです。

4

1 に答える 1

1

あなたの問題は、MergeSort アクターが子からサブリストを受け取ると、マージされたリストを送信者に送信することです。送信者は親ではなく子になります。

親フィールドを MergeSort に追加し、この親を使用するように送信を変更しました - 変更されたコードは次のとおりです

object Main extends App {

  var myArray = Array(5,2,7,6,8,1,15,5/*,9,10,56*/)
  var startSorting = new Starter(myArray)
  startSorting.start
  startSorting ! Begin
  var i = 0
  for( i <- 0 to myArray.length - 1){
   println(myArray(i))
  }

 }

 import scala.actors.Actor
 import scala.actors.Actor._

 abstract class SortArray 
 case object Sort extends SortArray
 case object FinishedSubArraySorting extends SortArray
 case object Begin extends SortArray

 class Starter(toBeSorted :Array[Int]) extends Actor{
   def act(){
     var first:Array[Int] = Array()
     var second:Array[Int] = Array()
    loop{
      react{
    case Begin =>
      var SortActor = new MergeSort(toBeSorted,self)
      SortActor.start
      SortActor ! Sort
    case sortedArray :Array[Int] =>
         var i = 0
         println("Sortat:")
         for( i <- 0 to sortedArray.length - 1){
             println(">"+sortedArray(i))
         }
      }
    }
   }
 }

 class MergeSort(toBeSorted :Array[Int],parent:Actor) extends Actor{
   def act(){
  var finishedSorting = 0
  var thisArray = toBeSorted
  var first:Array[Int] = Array();
  var second:Array[Int] = Array();
  var sortedSubArrays = 0;
  loop{
    react{
      case Sort =>
        if(thisArray.length == 1){
          finishedSorting = 1
          println(this + " sending up "+thisArray.mkString("[",",","]"))
          parent ! thisArray
          exit('stop)
        }else{
          first = thisArray.slice(0,thisArray.length/2)
          second = thisArray.slice(thisArray.length/2,thisArray.length)
          var firstSort = new MergeSort(first,self)
          var secondSort = new MergeSort(second,self)
          firstSort.start
          secondSort.start
          firstSort ! Sort
          secondSort ! Sort
        }
      case subSortedArray:Array[Int] =>
        println(this + " received " + subSortedArray.mkString("[",",","]"))
        sortedSubArrays = sortedSubArrays + 1
        if(sortedSubArrays == 1){
            first = subSortedArray
        }else{
          second = subSortedArray
          thisArray = merge(first,second)
          finishedSorting = 1
          parent ! thisArray
          exit('stop)
        }
    }
  }
   }
   def merge(firstArray :Array[Int],secondArray :Array[Int]):Array[Int] = {

var result:Array[Int] = new Array[Int](firstArray.length + secondArray.length)
var i = 0
var j = 0
var k = 0
while(i < firstArray.length && j < secondArray.length){
  if(firstArray(i) <= secondArray(j)){
    result(k) = firstArray(i)
    i = i + 1
  }else{
    result(k) = secondArray(j)
    j = j + 1
  }
  k = k + 1
}
while (i < firstArray.length)
{
    result(k) = firstArray(i)
    i = i + 1
    k = k + 1
}
while (j < secondArray.length)
{
    result(k) = secondArray(j)
    j = j + 1
    k = k + 1
}
return result
 }
}
于 2013-06-04T14:16:50.310 に答える