Если вы гарантируете, что y (и x) отсортированы / стали, как класс TreeSet
, следующее использует специальное объединение (внутренний метод addAllForTreeSet
).
for (Set<Integer> x : listA) {
for (SortedSet<Integer> y : listB) {
SortedSet<Integer> u = new TreeSet(x);
u.addAll(y);
SortedSet<Integer> i = new TreeSet(x);
i.retainAll(y);
}
}
Является ли этона самом деле быстрее, я не уверен.
Лучше было бы, если бы целые числа не были слишком дикими, ограничиваясь, скажем, 10_000.Если значения неотрицательны, можно сразу использовать BitSet
вместо Set<Integer>
.
Это непобедимо.Используйте конструктор BitSet с вероятной емкостью (например, 10_000).
for (BitSet x : listA) {
for (BitSet y : listB) {
BitSet u = x.clone();
u.or(y);
BitSet i = x.clone();
i.and(y);
}
}
. Можно использовать параллельный поток для сохранения коэффициента, равного числу процессоров.
listA.parallelStream().forEach(x -> {});
То естьвторичная оптимизация.
Гуава, которой я не пользовался в последние годы, не было ли наборов примитивного типа int
?