我想学习如何编写循环函数而不在代码前面删除“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实现的。
答案 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