2014-08-28 13 views
7

Mi può fornire un modo (possibilmente idiomatica) l'esecuzione per verificare se un elenco A è un elenco secondario di una data lista B?Verificare la presenza di un elenco secondario

E.g.

isSubList(List(1,2), List(1,2,3,4)) // => true 
isSubList(List(1,2), List(5,6,7,8)) // => false 
+3

Non è chiaro se si desidera un sottoinsieme o una fetta. Ad esempio, 'List (1,3)' una sottolista di 'List (1,2,3)' (sarebbe una sottolista di 'List (1,3,5)', chiaramente)? –

+0

domanda Duplicate vedere http://stackoverflow.com/a/3650325/1586965 – samthebest

risposta

8

Un modo potrebbe essere quello di utilizzare forall e contains:

scala> List(1, 2).forall(List(1, 2, 3, 4).contains) 
res3: Boolean = true 

scala> List(1, 2).forall(List(5, 6, 7, 8).contains) 
res4: Boolean = false 

scala> List(1, 2).forall(List(5, 6, 2, 9).contains) 
res5: Boolean = false 

Si noti che questo approccio non considera ordinazione:

scala> List(1, 2).forall(List(2, 1).contains) 
res6: Boolean = true 

Probabilmente si potrebbe usare anche Set s e intersect , ma penso che sia preferibile in questo modo.

+0

In pratica non si dovrebbe mettere qualcosa come 'List (1, 2, 3, 4)' all'interno di una lambda come sarà creare l'elenco più e al di sopra di. – samthebest

12

Se le questioni di ordine è possibile utilizzare containsSlice, che verificare se collezioni contiene una data sequenza come una fetta

def isSubList[A](l1:List[A], l2:List[A]) = l2.containsSlice(l1) 
1

Un'altra soluzione:

def isSubList[A](short: List[A], long: List[A]): Boolean = 
    long.tails exists (_.startsWith(short)) 

Tuttavia, sarebbe molto più efficace se elenchi sono stati convertiti in flussi di prima:

def isSubList[A](short: List[A], long: List[A]): Boolean = { 
    val sLong = long.toStream 
    val sShort = short.toStream 
    sLong.tails exists (_.startsWith(sShort)) 
} 

questo modo, non tutte le code h deve essere generato. Anche startsWith viene valutata in un breve circuito di moda

+0

Anche 'Iterator' e' view' funzionerebbero. – samthebest

Problemi correlati