Передача одинаковых данных двум или более методам в Scala - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь вызвать два метода в методе main и передать одинаковые данные обоим.Здесь второй параметр - это двумерный массив с n строками и 2 столбцами.Первый метод выполняется успешно, но когда вызов переходит ко второму методу с теми же данными, массив становится нулевым (все входные данные устанавливаются в ноль).Я хочу передать те же данные (массив) для обоих методов.Обратите внимание, что значение первого параметра (n) остается неизменным.Как передать одни и те же данные обоим методам?Код указан ниже.

object Demo {
  def main(args: Array[String]): Unit = {
    println("Enter number of process:");
    val n = scala.io.StdIn.readInt();
    var array: Array[Array[Double]] = Array.ofDim(n, 2)
    var bt: Double = 0
    var at: Double = 0
    for (i <- 0 to n - 1) {
      println("Enter BT for process: " + i);
      bt = scala.io.StdIn.readDouble();
      println("Enter AT for process: " + i);
      at = scala.io.StdIn.readDouble();
      array(i)(0) = at
      array(i)(1) = bt
    }
    One(n, array)
    Two(n, array)
  }
  def One(n: Int, data: Array[Array[Double]]): Unit = {
    var q = 0.0
    var arr = data
    arr = arr.sortBy(x => x(1))
    var arr_copy = arr
    var wt = new Array[Double](n)
    var a = new Array[Double](n)
    var tat = new Array[Double](n)
    var new_tat = new Array[Double](n)
    var new_wt = new Array[Double](n)
    var D_Sum = 0.0
    var sum = 0.0
    for (i <- 0 to n - 1) {
      a(i) = arr(i)(1)
    }
    for (i <- 0 to n - 1) {
      wt(i) = 0
    }
    var tracker = 0.0
    var li = 0
    var updated_TAT = 0.0
    do {
      D_Sum = 0.0
      arr = arr.filterNot(x => x(1) <= 0)
      for (i <- 0 to arr.size - 1) {
        D_Sum = D_Sum + arr(i)(1)
      }
      q = math.round(math.sqrt(arr.length * D_Sum * 1.49))
      for (i <- 0 to arr.size - 1) {
        if (tracker >= arr(i)(0)) {
          if (arr(i)(1) > q) { //if BT > quantum time
            arr(i)(1) -= q
            tracker = tracker + q
            for (j <- 0 to arr.size - 1) {
              if ((j != i) && (arr(j)(1) != 0))
                wt(j) += q
            }
          }
          else {
            for (j <- 0 to arr.size - 1) {
              if ((j != i) && (arr(j)(1) != 0)) {
                wt(j) += arr(i)(1)
              }
            }
            tracker = tracker + arr(i)(1)
            updated_TAT = tracker
            new_tat(li) = updated_TAT - arr_copy(i)(0)
            new_wt(li) = tracker - arr_copy(i)(1) - arr_copy(i)(0)
            li = li + 1
            arr(i)(1) = 0
          }
        }
      }
      sum = 0.0
      for (i <- 0 to arr.length - 1)
        sum = sum + arr(i)(1)
    } while (sum != 0)
    var avg_wt = 0.0
    var avg_tat = 0.0
    for (j <- 0 to n - 1)
      avg_wt += wt(j)
    for (j <- 0 to n - 1)
      avg_tat += new_tat(j)
    println("average waiting time= " + (avg_wt / n) + " Average turn around time= " + (avg_tat / n))
  }
  def Two(n: Int, data: Array[Array[Double]]): Unit = {
    var arr = data
    arr = arr.sortBy(x => x(1))
    var arr_copy = arr
    var q = 0.0
    var wt = new Array[Double](n)
    var a = new Array[Double](n)
    var tat = new Array[Double](n)
    var new_tat = new Array[Double](n)
    var new_wt = new Array[Double](n)
    var sum = 0.0
    for (i <- 0 to n - 1) {
      a(i) = arr(i)(1)
    }
    for (i <- 0 to n - 1) {
      wt(i) = 0
    }
    var tracker = 0.0
    var li = 0
    var updated_TAT = 0.0
    do {
      arr = arr.filterNot(x => x(1) <= 0)
      q = arr(0)(1)
      for (i <- 0 to arr.size - 1) {
        if (tracker >= arr(i)(0)) {
          if (arr(i)(1) > q) { //if BT > quantum time
            arr(i)(1) -= q
            tracker = tracker + q
            for (j <- 0 to arr.size - 1) {
              if ((j != i) && (arr(j)(1) != 0))
                wt(j) += q
            }
          }
          else {
            for (j <- 0 to arr.size - 1) {
              if ((j != i) && (arr(j)(1) != 0)) {
                wt(j) += arr(i)(1)
              }
            }
            tracker = tracker + arr(i)(1)
            updated_TAT = tracker
            new_tat(li) = updated_TAT - arr_copy(i)(0)
            new_wt(li) = tracker - arr_copy(i)(1) - arr_copy(i)(0)
            li = li + 1
            arr(i)(1) = 0
          }
        }
      }
      sum = 0.0
      for (i <- 0 to arr.length - 1)
        sum = sum + arr(i)(1)
    } while (sum != 0)
    var avg_wt = 0.0
    var avg_tat = 0.0
    for (j <- 0 to n - 1)
      avg_wt += wt(j)
    for (j <- 0 to n - 1)
      avg_tat += new_tat(j)
    println("average waiting time= " + (avg_wt / n) + " Average turn around time= " + (avg_tat / n))
  }
}

1 Ответ

1 голос
/ 09 марта 2019

Проблема здесь:

var arr = data

arr теперь является просто второй ссылкой на элементы в data, поэтому любые модификации arr (например, arr(i)(1) = 0) такжеизменения data.

Если вы хотите изменить arr без изменения data, вам нужно будет сделать глубокую копию.Примерно так:

var arr = data.map(_.map(identity))

Это всего лишь одна из многих, многих причин, по которым изменяемые переменные (var с) и изменяемые структуры данных (Array с)плохо, плохо , плохо .Хороший код Scala никогда (ну почти никогда) их не использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...