Scala方法删除数组中的重复项

lse*_*ohn 4 scala

我想学习如何编写循环函数而不在代码前面删除"var".例如,我想删除整数数组中的重复项.在C++/Java中,我可以这样做:

int removeDuplicate(vector<int> nums)
{
     vector<int> output
     Map<int,int> counter;
     for(i = 0; i < nums.size(); i++)
     {
         if(!counter.has_key(nums[i]))
         {
             counter[nums[i]]=1;  //add new key-value pair
             output.push_back(nums[i]);
         }
     }

     return output;
}
Run Code Online (Sandbox Code Playgroud)

但是在scala中,如何使用不可变变量来完成上述任务.

不要使用scala的内部函数,例如distinct.这个问题是关于Scala的实现.

Nya*_*vro 12

在Scala中,为避免在这种情况下使用vars,您可以使用递归或foldLeftfoldRight:

def distinct[A](list:List[A]):List[A] = 
  list.foldLeft(List[A]()) {
    case (acc, item) if acc.contains(item) => acc
    case (acc, item) => item::acc
  }   
Run Code Online (Sandbox Code Playgroud)


Mah*_*and 5

Scala 提供了大量的库函数。就像,有独特的功能。你可以直接调用它。

scala> val array = Array(1,2,3,2,1,4)
array: Array[Int] = Array(1, 2, 3, 2, 1, 4)
scala> array.distinct
res0: Array[Int] = Array(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

而如果没有库函数,我们更喜欢使用递归(主要是尾递归)来编写代码,这样我们就可以保持不变性。或者您可以将数组转换为集合,这将删除重复项,然后再次将集合转换为数组以获得所需的结果。

scala> array.toSet.toArray
res3: Array[Int] = Array(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

在 scala 中,列表优于数组,因为数组是 scala 中的可变集合,而列表是不可变的。所以比较喜欢用它。