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, которые принимают любую коллекцию в качестве входного параметра.