Если n & lt; 63, что является разумным предположением, так как вы исчерпали память (если только не используете реализацию итератора), пытаясь в любом случае построить набор мощности, это более краткий способ сделать это. Двоичные операции быстрее, чем Math.pow()
и массивы для масок, но почему-то пользователи Java боятся их ...
List<T> list = new ArrayList<T>(originalSet);
int n = list.size();
Set<Set<T>> powerSet = new HashSet<Set<T>>();
for( long i = 0; i < (1 << n); i++) {
Set<T> element = new HashSet<T>();
for( int j = 0; j < n; j++ )
if( (i >> j) % 2 == 1 ) element.add(list.get(j));
powerSet.add(element);
}
return powerSet;