Scala-如何修改通过引用传递给方法的输入数组?

问题描述 投票:0回答:1

问题陈述

我将尝试通过场景来详细说明该案例。让我们以这个问题为例。

链接到问题:https://leetcode.com/problems/remove-element/

给出数组nums和值target,请删除该值就位并返回新长度。

不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。

示例:给定nums = [0,1,2,2,3,0,4,2]target = 2output = 5(不等于目标的元素数)并将数组修改为[0,1,3,0,4]

元素的顺序可以更改。离开什么都没关系超出了新的长度。

我的方法

步骤1:确定所有与给定目标相等的元素,并将它们移到数组的右侧,同时保持一个计数器。

步骤2:从右侧删除所有元素。

步骤3:return (n - counter),其中n是数组长度,而counter是等于目标的元素数。

下面是相同的实现:

object RemoveElement {
  // Link to question: https://leetcode.com/problems/remove-element/
  def main(args: Array[String]): Unit = {
    var nums = Array(3,2,2,3)
    val target = 3
    val result = removeElement(nums, target)
    // nums = nums.dropRight(_.equals(target)) // POINT 1
    println(s"Result: ${result}, Modified Array: [${nums.mkString(", ")}]")
  }

  def removeElement(nums: Array[Int], target: Int): Int = {
    val n = nums.length
    var left, counter = 0
    var right = n - 1

    while(left < right){
      if(nums(left) != target){
        left += 1
      }
      else {
        // Find position of the elements which is not equal to target
        if(nums(right) == target){
          counter += 1
          right -= 1
        }
        else{
          // Swap the elements
          counter += 1
          val temp = nums(left)
          nums(left) = nums(right)
          nums(right) = temp
          left += 1
          right -= 1
        }
      } 
    }
    // nums.dropWhile(_.equals(target))  // POINT 2
    // nums = nums.dropRight(_.equals(target))  // POINT 3
    return (n - counter)
  }
}

POINT-1:绝对有意义,因为数组nums在main方法的范围内,因此,该语句将用作charm。

要点2:这些行对数组nums没有影响。

要点-3:给出错误。我知道输入参数(数组nums)的类型为val(即通过引用传递,因此在方法removeElement的范围内是不变的)。

如果我可以选择创建一个新数组,就不会有任何问题。但是,如果我需要通过将元素添加/删除(如在此问题中)到调用方法来返回修改后的数组,那么如何在Scala中实现呢?

为了使情况更通用,在Scala方法中修改输入集合(作为参数传递)的方式是什么?

P.S。:如果我不从输入数组本身中删除元素,LeetCode将失败,并显示以下消息:

enter image description here

arrays scala pass-by-reference
1个回答
0
投票

如何修改通过引用传递给方法的输入数组?

Scala不支持传递引用。默认值为按值传递(或更确切地说,按值传递的一种特殊情况,有时也称为按对象调用,按共享调用或按对象共享调用)。 Scala还支持按名称呼叫。

因此,您只需cannot在Scala中通过引用将数组传递给方法。您将不得不使用另一种支持传递引用的语言,例如C#(带有ref关键字)或C ++。 (请注意,Java也不支持传递引用。)

© www.soinside.com 2019 - 2024. All rights reserved.