2016-07-04 75 views
2

我怎样才能从列表中删除子表的所有事件,如如何删除子列表

List(1, 2, 3, 4, 5, 6, 7, 4, 8, 9, 10, 5).removeSubList(4, 5) 

应该删除所有出现的(4,5)(顺序),所以它返回

List(1, 2, 3, 6, 7, 4, 8, 9, 10, 5) 

回答

4

使用indexOfSlice递归溶液:

def removeSubList(l: List[Int], sublist: List[Int]): List[Int] = l.indexOfSlice(sublist) match { 
    case -1 => l 
    case index => removeSubList(l.patch(index, Nil, sublist.length), sublist) 
} 

// all of these print List(1 ,2 ,3): 
println(removeSubList(List(1,2,3), List(4,5))) 
println(removeSubList(List(1,2,3,4,5), List(4,5))) 
println(removeSubList(List(4,5,1,2,3), List(4,5))) 
println(removeSubList(List(4,5,1,2,4,5,3), List(4,5))) 

EDITED

  • (感谢@ corvus_192)恢复到使用indexOfSlice版本,而不是使用diff,而忽略子列表顺序。
  • (感谢@The原型保罗)使用patch对清洁去除子表的
+0

'removeSubList(List(1,5,4,5,2),List(4,5))'返回List(1) ,2)''而不是'List(1,5,2)' –

+0

谢谢@ corvus_192 - 使用'indexOfSlice'恢复到原始版本 –

+0

您可以使用'patch'取出子列表 –

1

使用Tzach琐想法不同的实现:

def removeSubList[T](list: List[T], sublist: List[T]): List[T] = 
    if (list.containsSlice(sublist)) 
     removeSubList(list.diff(sublist), sublist) 
    else list 
+0

我不这么认为 - OP希望(4,5)除去的所有实例,而'列表(4,5,1,4,5)为.diff(名单(4,5))会产生'List(1,4,5)' –

0

Tzach琐想法变但假定的OP想要的结果不包括曾经给定的子表。处理的情况下sublist是空

/** 
    * Return `s` with no occurrence of `target` present 
    * 
    * @param s 
    * @param target 
    * @return The sequence free of any occurrence of the target slice 
    */ 
    def removeCompletely[E](s: Seq[E], target: Seq[E]): Seq[E] = { 
    if (s.isEmpty || target.isEmpty) 
     s 
    else 
     removeCompletely0(s, target) 
    } 

    private def removeCompletely0[E](s: Seq[E], target: Seq[E]): Seq[E] = { 
    val sliceIdx = s.indexOfSlice(target) 
    if (sliceIdx >= 0) { 
     val patched = s.patch(sliceIdx, s take 0, target.size) 
     removeCompletely0(patched, target) 
    } 
    else { 
     s 
    } 
    }