API для заданий в Java?

Существует ли API для операций Set, таких как объединение, пересечение, разность, декартово произведение, функция от набора к другому, ограничение домена и ограничение диапазона этих функций.... в Java?

Прокомментируйте покрытие (операций) и производительность.

Спасибо

Ответы

Ответ 1

Да, класс java Set.

Через учебник Java SE:

s1.containsAll(s2) - возвращает true, если s2 - подмножество s1. (s2 является подмножество s1, если множество s1 содержит все элементы из s2.)

s1.addAll(s2) - преобразует s1 в объединение s1 и s2. (The объединение двух множеств - это множество, содержащее все элементы, содержащиеся в любом наборе.)

s1.retainAll(s2) - преобразует s1 в пересечение s1 и s2. (Пересечение двух множеств - это множество, содержащее только элементы общий для обоих наборов.)

s1.removeAll(s2) - преобразует s1 в (асимметричный) набор разность s1 и s2. (Например, заданное различие s1 минус s2 - это множество, содержащее все элементы, найденные в s1, но не в с2.)

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

Ответ 2

Я не знаю никакого API, но использовал следующие методы, делаю такие вещи на 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);
  }

Ссылка: Установить операции: объединение, пересечение, разность, симметричная разность, подмножество, является надмножеством

Ответ 3

В библиотеке Google Guava также есть множество полезных методов (например, объединение и различие).

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

Пример (со страницы, указанной выше):

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();

Ответ 4

Класс java.util.Set не имеет этих вызовов в своем API, но вы можете комбинировать операции, такие как removeAll(), retainAll() и addAll() сделать соединение, пересечение и разницу. Я не уверен, что знаю, что вы подразумеваете под ограничением домена.

Ответ 5

Установить из API

Вы можете "имитировать" пересечение, разницу, ограничение домена с помощью методов keepAll, removeAll и addAll, которые принимают любую коллекцию в качестве входного параметра.