2011-05-03 9 views
15

¿Hay una API para establecer operaciones como Unión, intersección, diferencia, producto cartesiano, Función de un conjunto a otro, restricción de dominio y rango de esas funciones, .... en Java?API para establecer operaciones en Java?

Comente la cobertura (de operaciones) y el rendimiento.

Gracias

Respuesta

22

Sí, la clase Java Set.

mediante Java SE tutorial:

s1.containsAll(s2) - devuelve verdadero si s2 es un subconjunto de s1. (s2 es un subconjunto de s1 si el conjunto s1 contiene todos los elementos en s2.)

s1.addAll(s2) - transforma s1 en la unión de s1 y s2. (El unión de dos conjuntos es el conjunto que contiene todos los elementos contenidos ya sea en conjunto.)

s1.retainAll(s2) - transforma s1 en la intersección de s1 y s2. (La intersección de dos conjuntos es el conjunto que contiene sólo los elementos común a ambos conjuntos.)

s1.removeAll(s2) - transforma s1 en el (asimétrica) establece diferencia de s1 y s2. (Por ejemplo, la diferencia conjunto de s1 menos S2 es el conjunto que contiene todos los elementos que se encuentran en s1 pero no en s2.)

http://download.oracle.com/javase/tutorial/collections/interfaces/set.html

2

La clase java.util.Set no tiene esas llamadas en su API, pero puede combinar operaciones como removeAll(), retainAll() y addAll() para hacer la unión, intersección y diferencia. No estoy seguro de saber a qué te refieres con restricción de dominio.

+0

Gracias. También estaba hablando de operaciones en funciones de conjunto. –

2

Set from the API

Puede intersección 'simular', diferencia, la restricción de dominio con retainAll, removeAll y el método addAll que acepta ninguna colección como un parámetro de entrada.

13

No conozco ninguna API pero he usado los siguientes métodos para hacer tales cosas en Set.

public static <T> Set<T> union(Set<T> setA, Set<T> setB) { 
    Set<T> tmp = new TreeSet<T>(setA); 
    tmp.addAll(setB); 
    return tmp; 
    } 

    public static <T> Set<T> intersection(Set<T> setA, Set<T> setB) { 
    Set<T> tmp = new TreeSet<T>(); 
    for (T x : setA) 
     if (setB.contains(x)) 
     tmp.add(x); 
    return tmp; 
    } 

    public static <T> Set<T> difference(Set<T> setA, Set<T> setB) { 
    Set<T> tmp = new TreeSet<T>(setA); 
    tmp.removeAll(setB); 
    return tmp; 
    } 

    public static <T> Set<T> symDifference(Set<T> setA, Set<T> setB) { 
    Set<T> tmpA; 
    Set<T> tmpB; 

    tmpA = union(setA, setB); 
    tmpB = intersection(setA, setB); 
    return difference(tmpA, tmpB); 
    } 

    public static <T> boolean isSubset(Set<T> setA, Set<T> setB) { 
    return setB.containsAll(setA); 
    } 

    public static <T> boolean isSuperset(Set<T> setA, Set<T> setB) { 
    return setA.containsAll(setB); 
    } 

Referencia: Set operations: union, intersection, difference, symmetric difference, is subset, is superset

4

La biblioteca de Google Guava también tiene un montón de métodos útiles (por ejemplo, conjunto de unión y de diferencia).

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Sets

Ejemplo (de la página vinculado anteriormente):

Set<String> wordsWithPrimeLength = ImmutableSet.of("one", "two", "three", "six", "seven", "eight"); 
Set<String> primes = ImmutableSet.of("two", "three", "five", "seven"); 

SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength); // contains "two", "three", "seven" 
// I can use intersection as a Set directly, but copying it can be more efficient if I use it a lot. 
return intersection.immutableCopy(); 
+1

Esta biblioteca ha quedado en desuso en favor de Guava: https://code.google.com/p/guava-libraries/ –