2015-03-26 12 views
5

Bir listedeki her öğenin başka bir listede aynı dizinin bir öğesinin doğru bir şekilde karşılık gelip gelmediğini görmezsem, bunu yapmak için forall kullanabilir miyim?Scala forall?

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

ben x I having q bir endeks değildir ve şu anlıyoruz gibi örnek bir şey için, bu işi yapmak için herhangi bir yolu var mı? hangi can, Ayrıca zipped kullanabilirsiniz

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

:

cevap

10

en deyimsel yolu kullanmak muhtemelen Bazı durumlarda biraz daha verimli olmanın yanı sıra, biraz daha özlü (ya da belki sadece gizlenmiş) olmanıza izin vermek:

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

Listelerin aynı uzunlukta olmaması durumunda, bu çözümlerin her ikisinin de ek öğeleri sessizce görmezden geleceğini unutmayın; bu, istediğiniz gibi olabilir veya olmayabilir. p ve q farklı uzunlukta ise

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

Yanlış döndürür: scala toplama kütüphanesinden

2

Yapabileceğiniz en iyi şey, iki listeleri zip olacaktır bu durumun üstesinden gelmek için zip

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

Diziler ihtiyacınız tam olarak ne yapar corresponds yöntemi var.