2016-07-30 6 views
0

最も簡単です何リストのすべてのインスタンスを別のリストからどのように削除しますか?

List(1,2,6,4,4,2,1,3,6,3,2) 

...私はリスト

val l = List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2) 

を持っていると私はそのように所望の出力となるよう(2,3)

として特定のシーケンスのすべてのインスタンスを削除したいです/ Scalaでこれを達成するための最も慣用的な方法は?

私がこれまでにこれをやってみました

..

l.sliding(2).filter{ _!=List(2,3) } 

が、その後、私は正しい軌道に乗ってるなら、私は不思議作られ、そこから行くことを把握することはできません。コンセプトの

+1

この質問は明確ではありません。 'List(1,2,1,2,1)'を持っていて、 '1,2,1'というシーケンスを削除したい場合はどうすればいいですか? 'List(1,2)'や 'List(2,1)'で終わるのですか? – Alec

+0

@ cricket_007私の質問を更新しました @Alec一般的にあなたは正しいです。この特定の例では、削除を左から開始して右に行く必要があるので、あなたの例では結果は 'List(2,1)' –

+0

ありがとう、しかしあなたはどこへ行こうとしていますかそこから?それはあなたのために働かないのですか? –

答えて

1

あなたは、一度にリスト1の先頭から要素を消費し、結果リストに目的のものを蓄積し、再帰的にリストを反復することができます一致する望ましくないシーケンス。シンプルな末尾再帰的例は次のように仕事ができる:一般

@annotation.tailrec 
def filterList[A](list: List[A], acc: List[A] = Nil): List[A] = list match { 
    case 2 :: 3 :: tail => filterList(tail, acc) 
    case head :: tail => filterList(tail, head :: acc) 
    case Nil => acc.reverse 
} 

scala> val l = List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2) 
scala> filterList(l) 
res0: List[Int] = List(1, 2, 6, 4, 4, 2, 1, 3, 6, 3, 2) 

以上、あなたはListの現在の反復を削除するシーケンスを開始していることを確認するためにstartsWithを使用することができます。

@annotation.tailrec 
def filterList[A](list: List[A], subList: List[A], acc: List[A] = Nil): List[A] = list match { 
    case l if(list startsWith subList) => filterList(l.drop(subList.length), subList, acc) 
    case head :: tail => filterList(tail, subList, head :: acc) 
    case Nil => acc.reverse 
} 

scala> filterList(l, List(2, 3)) 
res4: List[Int] = List(1, 2, 6, 4, 4, 2, 1, 3, 6, 3, 2) 

パフォーマンスが問題になる場合は、accを変更可能にすることができます。

+0

この回答m-zをありがとう、私は、私のユースケースでスタックをバストしないように、この尾の再帰的なものが必要でした。 –

1
def stripFrom[A](lst: List[A], x: List[A]): List[A] = 
    if (lst.containsSlice(x) && x.length > 0) 
    stripFrom(lst.patch(lst.indexOfSlice(x), List(), x.length), x) 
    else lst 

証明:廃棄ながら

scala> stripFrom(List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2), List(2,3)) 
res3: List[Int] = List(1, 2, 6, 4, 4, 2, 1, 3, 6, 3, 2) 

scala> stripFrom(List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2), List(4,2)) 
res4: List[Int] = List(1, 2, 3, 2, 6, 3, 1, 3, 6, 3, 2) 

scala> stripFrom(List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2), List(4,2,3,4)) 
res5: List[Int] = List(1, 2, 3, 2, 6, 2, 1, 3, 6, 3, 2) 

scala> stripFrom(List(1,2,3,2,6,4,2,3,4,2,1,3,6,3,2), List(2)) 
res6: List[Int] = List(1, 3, 6, 4, 3, 4, 1, 3, 6, 3) 
+0

O(n^2)の近傍にこれを置くことが何度も繰り返される必要があるので、 'lst'から削除する' x'のインスタンスがたくさんあると、これは非常に遅くなることに注意してください。 。 –

関連する問題