Obtaining a powerset of a set in Java

后端 未结 26 2248
青春惊慌失措
青春惊慌失措 2020-11-22 11:33

The powerset of {1, 2, 3} is:

{{}, {2}, {3}, {2, 3}, {1, 2}, {1, 3}, {1, 2, 3}, {1}}

Let\'s say I have a Set in Java:<

26条回答
  •  清歌不尽
    2020-11-22 12:07

    I was looking for a solution that wasn't as huge as the ones posted here. This targets Java 7, so it will require a handful of pastes for versions 5 and 6.

    Set> powerSetofNodes(Set orig) {
        Set> powerSet = new HashSet<>(),
            runSet = new HashSet<>(),
            thisSet = new HashSet<>();
    
        while (powerSet.size() < (Math.pow(2, orig.size())-1)) {
            if (powerSet.isEmpty()) {
                for (Object o : orig) {
                    Set s = new TreeSet<>();
                    s.add(o);
                    runSet.add(s);
                    powerSet.add(s);
                }
                continue;
            }
            for (Object o : orig) {
                for (Set s : runSet) {
                    Set s2 = new TreeSet<>();
                    s2.addAll(s);
                    s2.add(o);
                    powerSet.add(s2);
                    thisSet.add(s2);
                }
            }
            runSet.clear();
            runSet.addAll(thisSet);
            thisSet.clear();
        }
        powerSet.add(new TreeSet());
        return powerSet;
    
    
    

    Here's some example code to test:

    Set hs = new HashSet<>();
    hs.add(1);
    hs.add(2);
    hs.add(3);
    hs.add(4);
    for(Set s : powerSetofNodes(hs)) {
        System.out.println(Arrays.toString(s.toArray()));
    }
    
        

    提交回复
    热议问题