2015-02-24 7 views
11

Bazı Java kodlarını Scala'ya dönüştürme konusunda çalışırken, Scala'nın Set için contains yöntemi bulunduğunu keşfettim, containsAll yöntemi yoktur. Sadece doğru yöntem adını eksik miyim?Scala's Set ile, Java'nın Set'teki includesAll yöntemine benzeyen bir yöntem var mı?

Boşluğu doldurmak için çalıştığım küçük bir kod işte bu yüzden çabucak çalışmaya dönebildim. Yeterli mi, yoksa biraz incelik mi eksik?

def containsAll[A](set: Set[A], subset: Set[A]): Boolean = 
    if (set.size >= subset.size) 
     subset.forall(a => set.contains(a)) 
    else 
     false 

cevap

17

vardır, subsetOf bir Set elemanları bir Set içinde yer olup olmadığına test eder. (Ekspresyonu açısından ters Tür) Scala

val set = Set(1,2,3,4) 
val subset = Set(1,2) 

scala> subset.subsetOf(set) 
res0: Boolean = true 

scala> set.subsetOf(subset) 
res1: Boolean = false 
+0

Ah. Çok hoş. Java’dan geri döndüğü için biraz karşı tutumlu. Ama kesinlikle ihtiyacım olanı yapar. Hızlı yanıtınız için Tysvm. – chaotic3quilibrium

5

, Set böylece, örneğin bu tür intersect olarak küme işlemleri ile donatılmıştır

set.intersect(subset) == subset 

da subsetOf olduğu, containsAll semantik taşır daha önce belirtildiği gibi en özlü olduğunu kanıtlamaktadır.

+0

Bu büyük boyuttaki setlerde (milyonlarca giriş) hayal edemez mi? IOW, şimdi iki operasyon var, kesişimi gerçekleştiriyor ve sonra denklik kontrolünü yapıyor. İkinci set içindeki elemanlar için ilk set testinden tek bir geçiş, çok tercih edilir ve çok daha fazla performans gösterir. – chaotic3quilibrium

3

İsterseniz, örtülü zenginleştirilmiş bir sınıf kullanarak Set[T]containsAll türetilmiş yardımcı yöntemler yapabilirsiniz. Ayrıca variadic aşırı da düşünebilir:

implicit class RichSet[T](val x: Set[T]) extends AnyVal { 
    def containsAll(y: Set[T]): Boolean = y.subsetOf(x) 
    def containsAll(y: T*): Boolean = x.containsAll(y.toSet) 
} 

Öyleyse yapabilirsiniz:

Set(1, 2, 3).containsAll(Set(1, 2)) 

Veya:

Set(1, 2, 3).containsAll(1, 2) 
+0

Çok güzel bitti! Bunu kütüphaneme kesinlikle ekleyeceğim. – chaotic3quilibrium

+0

Açıktan akıl yürütmenin ardında yatan neden 'AnyVal'ı uzatmaktan ziyade' uzanır? ' – chaotic3quilibrium

+3

Daha verimli. Dokümanlardan: "... derleyici tarafından özel olarak ele alınan kullanıcı tanımlı bir değer sınıfı olarak adlandırılan AnyVal'in bir alt sınıfını tanımlamak mümkündür. Düzgün olarak tanımlanmış kullanıcı değeri sınıfları, kullanıcı tanımlı türler üzerindeki performansı iyileştirmek için bir yol sağlar. Çalışma zamanında nesne tahsisi kaçınarak ve statik yöntem çağrıları ile sanal yöntem çağırmalarını değiştirerek. " Burada AnyVal ve kullanıcı tanımlı değer sınıfları hakkında daha fazla bilgi edinin: http://www.scala-lang.org/api/2.11.4/index.html#scala.AnyVal –

İlgili konular