Pregunta Con Scala's Set, ¿existe un método análogo al método containsAll en el conjunto de Java?


Mientras trabajaba en la conversión de algunos códigos Java a Scala, descubrí mientras había un contains método para Scala Set, no hay un containsAll método. ¿Me estoy perdiendo el nombre correcto del método?

Aquí hay un poco de código que trabajé para llenar el hueco para poder volver a trabajar rápidamente. ¿Es suficiente, o me falta algo de sutileza?

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

12
2018-02-24 20:38


origen


Respuestas:


Ahi esta subsetOf, que prueba si los elementos de un Set están contenidos dentro de otro Set. (Tipo de lo contrario en términos de la expresión)

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

19
2018-02-24 20:43



En Scala, Set está equipado con operaciones de ajuste tales como intersect, por ejemplo,

set.intersect(subset) == subset

transmite la semántica de containsAll, incluso eso subsetOf como ya se mencionó, es el más breve.


6
2018-02-24 23:02



Vale la pena agregar que puedes hacer métodos auxiliares derivados como containsAll disponible en Set[T] si lo desea, utilizando una clase implícita enriquecida. También podría considerar hacer una sobrecarga variadic:

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)
}

Entonces puedes hacer:

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

O:

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

4
2018-02-25 00:08



Preguntas populares