Initialize Power установлен как анонимный интерфейс - PullRequest
0 голосов
/ 06 февраля 2020
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PowerSet {

    public static final <E> Collection<Set<E>> of(Set<E> s) {
        List<E> src = new ArrayList<>(s);
        if (src.size() > 30) {
            throw new IllegalArgumentException("Set too big " + s);
        }
        return new AbstractList<Set<E>>() {
            @Override
            public int size() {
                return 1 << src.size(); // 2 to the power srcSize
            }

            @Override
            public boolean contains(Object o) {
                return o instanceof Set && src.containsAll((Set) o);
            }

            @Override
            public Set<E> get(int index) {
                Set<E> result = new HashSet<>();
                for (int i = 0; index != 0; i++, index >>= 1) {
                    if ((index & 1) == 1) {
                        result.add(src.get(i));
                    }
                }
                return result;
            }
        };


    }

    public static void main(String[] args) {
        Collection<Set<String>> set = new HashSet<>();
        set.add()...    }

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

1 Ответ

0 голосов
/ 06 февраля 2020

Для инициализации экземпляра PowerSet вам нужно вызвать его конструктор PowerSet (), хотя это будет бесполезно, поскольку в нем нет связанных с объектом логик c.

"of" - это метод stati c, объявленный в PowerSet, который принимает набор с размером <= 30 и возвращает список наборов с logi c из <a href="https://en.wikipedia.org/wiki/Power_set" rel="nofollow noreferrer"> power set . Это реализовано расширением AbstractList.

Set<Long> input = new HashSet<Long>();
input.add(1L);
input.add(2L);
List<Set<Long>> example = PowerSet.<Long>of(input);

Итак, example.get(0) приведет к пустому HashSet, example.get(1) == {1}; example.get(2) == {2}, example.get(3) == {1, 2}

Вы можете переписать его в более обычном формате:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PowerSet<E> extends AbstractList<Set<E>> { 

    private List<E> src;

    public PowerSet(Set<E> s){
       //copying set contains to a list to access by index
       src = new ArrayList<>(s);
    } 
    @Override
    public int size() {
        return 1 << src.size(); // 2 to the power srcSize
    }

    @Override
    public boolean contains(Object o) {
        return o instanceof Set && src.containsAll((Set) o);
    }

    @Override
    public Set<E> get(int index) {
        Set<E> result = new HashSet<>();
        for (int i = 0; index != 0; i++, index >>= 1) {
            if ((index & 1) == 1) {
                 result.add(src.get(i));
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add()...  
        PowerSet<String> = new PowerSet(set);  

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...