2015-03-26 17 views
5

Jeśli nie zobaczę, czy każdy element na liście poprawnie odpowiada elementowi tego samego indeksu na innej liście, czy mógłbym użyć do tego celu? Na przykład coś takiegoScala forall, aby porównać dwie listy?

val p=List(2,4,6) 
val q=List(1,2,3) 
p.forall(x=>x==q(x)/2) 

Rozumiem, że x nie jest indeksem Q, i to problem mam, czy jest jakiś sposób aby to działało?

Odpowiedz

10

najbardziej idiomatyczne sposób obsłużyć tej sytuacji byłoby zip dwóch list:

scala> p.zip(q).forall { case (x, y) => x == y * 2 } 
res0: Boolean = true 

Można również użyć zipped, które mogą być nieco bardziej efektywnym w niektórych sytuacjach, a także pozwolić ci być nieco bardziej zwięzłym (lub może po prostu zaciemnionym):

scala> (p, q).zipped.forall(_ == _ * 2) 
res1: Boolean = true 

Należy pamiętać, że oba te rozwiązania będą w milczeniu ignorować dodatkowe elementy, jeśli listy nie mają tej samej długości, która może być lub nie być zgodna z oczekiwaniami.

2

Najprościej jest prawdopodobnie używać zip

p.zip(q).forall{case (fst, snd) => fst == snd * 2} 
1

Sekwencje z biblioteki kolekcji Scala mieć corresponds metodę, która robi dokładnie to, czego potrzebujesz:

p.corresponds(q)(_ == _ * 2) 

To będzie return false jeśli p i q są różnej długości.