public class GuavaSetsTest extends TestNg {
@Test
public void test() {
Random random = new Random();
// 构造 300 个 set 做交集
int setCount = 300;
// 每个 set 里固定包括 0~~127
Set<Long> base = new HashSet<>();
for (long i = 0; i <= 127; i++) {
base.add(i);
}
List<Set<Long>> sets = new ArrayList<>(300);
for (int i = 0; i < setCount; i++) {
Set<Long> set = new HashSet<>(base);
// set 的尺寸为 128+(0~~100)
int setSize = random.nextInt(100) + 128;
int max = setSize * 10;
for (; set.size() < setSize;) {
set.add(Long.valueOf(random.nextInt(max)));
}
sets.add(set);
}
Set<Long> result = sets.get(0);
long start = System.currentTimeMillis();
for (int n = 1; n < sets.size(); n++) {
result = Sets.intersection(result, sets.get(n));
// result.size();
}
System.out.println("elapse=" + (System.currentTimeMillis() - start));
}
}
@Override
public UnmodifiableIterator<E> iterator() {
return Iterators.filter(set1.iterator(), inSet2);
}
@Override
public int size() {
return Iterators.size(iterator());
}
@Override
public boolean isEmpty() {
return !iterator().hasNext();
}
public static int size(Iterator<?> iterator) {
long count = 0L;
while (iterator.hasNext()) {
iterator.next();
count++;
}
return Ints.saturatedCast(count);
}
result = ImmutableSet.copyOf(Sets.intersection(result, sets.get(n)));
public static final <E> Set<E> intersection(Set<E> set1, Set<E> set2) {
Set<E> shortSet, longSet;
if (set1.size() > set2.size()) {
longSet = set1;
shortSet = set2;
} else {
longSet = set2;
shortSet = set1;
}
if (shortSet.size() == 0) {
return Collections.emptySet();
}
Set<E> result = Sets.newHashSetWithExpectedSize(shortSet.size());
for (E item : shortSet) {
if (longSet.contains(item)) {
result.add(item);
}
}
return result;
}