Scala中的筛选器函数不工作 def过滤器(数据:List[Int]):List[Int]={ 如果(data.length==0){ 返回数据; }否则{ 变量列表:list[Int]=list(); var指数=0; 对于((value,index)
来说,通过索引访问一个列表并为结果创建另一个列表是一种代码味道。下面是另一种递归和模式匹配的方法,这是一种非常简单的解决方案Scala中的筛选器函数不工作 def过滤器(数据:List[Int]):List[Int]={ 如果(data.length==0){ 返回数据; }否则{ 变量列表:list[Int]=list(); var指数=0; 对于((value,index),list,scala,if-statement,for-loop,filter,List,Scala,If Statement,For Loop,Filter,来说,通过索引访问一个列表并为结果创建另一个列表是一种代码味道。下面是另一种递归和模式匹配的方法,这是一种非常简单的解决方案 def filter(data : List[Int]) : List[Int] = { if(data.length == 0){ return data; }else{ var list: List[Int] = List(); var index = 0; for((value,index) <- data.z
def filter(data : List[Int]) : List[Int] = {
if(data.length == 0){
return data;
}else{
var list: List[Int] = List();
var index = 0;
for((value,index) <- data.zipWithIndex){
if(list(index) == list(index+1){
list = value :: list;
//println(list(index));
}
}
}
return list
}
}
测试用例:
def filterNextTo(xs: List[Int]):List[Int] = xs match{
case h :: ht :: t => if(h == ht) filterNextTo(xs.tail) else h :: filterNextTo(xs.tail)
case h :: Nil => List(h)
case Nil => Nil
}
这也可以通过zip
、filter
和map
实现,但需要一些元组争论和处理一个我认为不太优雅的特殊情况
更新为根据@Paul的评论添加尾部递归版本:
scala> xs
res7: List[Int] = List(1, 2, 3, 3, 4, 3, 1)
scala> filterNextTo(xs)
res8: List[Int] = List(1, 2, 3, 4, 3, 1)
我认为fold比显式递归更简洁,可以处理长列表:
def filterNextTo(xs: List[Int]) = {
@tailrec
def filterNextToR(xs: List[Int], acc: List[Int]): List[Int] = xs match{
case h :: ht :: t if (h == ht) => filterNextToR(xs.tail, acc)
case h :: ht :: t if (h != ht) => filterNextToR(xs.tail, h :: acc)
case h :: t => (h :: acc).reverse
}
filterNextToR(xs, List[Int]())
}
试试这个
ls match {
case Nil => Nil
case h :: t => t.foldLeft(List(h))
((a, b) => if (a.head == b) a
else b :: a)
.reverse
}
//> res0: List[Int] = List(1, 2, 3, 4, 3, 1)
index+1
超出了最后一个列表元素的范围。而且您正在以相反的顺序构建列表。您可能希望使用ListBuffer
或使用递归方法,而不是使用for
。我的想法是使用将列表复制到另一个列表中。一旦开始工作,请使用“头,尾”进行反向操作?目前我对这种语言还很陌生。它正在分解列表以获得头部、尾部的头部和尾部。虽然尾部不是递归的,但会在长列表上堆栈溢出。最后两个case语句可以替换为一个:case ys=>ys
as filternexto
只返回这两种情况下的输入
val list = List(1, 2, 3, 3, 4, 3, 1,1,5,5,6,6)
val y = list.sliding(2).toList
val x =y.filter(x=> (x.head != x.tail.head)).map(_.head) :+ (y.reverse.filter(x=> x.head !=x.tail.head)).head.tail.head