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

时间:2017-09-09 01:00:09

标签: 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;
}

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

请勿使用scala的内部函数,例如distinct。这个问题是关于Scala实现的。

3 个答案:

答案 0 :(得分:11)

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

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
  }   

答案 1 :(得分:3)

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)

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

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

在scala中,list优先于数组,因为数组是scala中的可变集合,list是不可变的。所以更喜欢使用它。

答案 2 :(得分:0)

在Scala中有几种方法可以做到这一点(没有区别)。所有这些替代方案都使用不可变变量:

使用groupBy

val x: Seq[Int] = Seq(1,2,3,3,4,5,6,6)
val unique: Seq[Int] = x.groupBy(identity).keys.toSeq

使用设置

val x: Seq[Int] = Seq(1,2,3,3,4,5,6,6)
val unique: Seq[Int] = x.toSet.toSeq