Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的筛选器函数不工作 def过滤器(数据:List[Int]):List[Int]={ 如果(data.length==0){ 返回数据; }否则{ 变量列表:list[Int]=list(); var指数=0; 对于((value,index)_List_Scala_If Statement_For Loop_Filter - Fatal编程技术网

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 f
ilternexto
只返回这两种情况下的输入
  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