Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I borrowed heavily from <a href="https://stackoverflow.com/users/216517/st0le">st0le</a>'s <a href="https://stackoverflow.com/a/3078491/300257">answer</a>.</p> <p>Basically, as I iterated through the bit array that was controlling the set generation, I checked to make sure that the number of bits was between the minimum and maximum.</p> <p>Here's the code.</p> <pre><code>import java.util.BitSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class PowerSet&lt;E&gt; implements Iterator&lt;Set&lt;E&gt;&gt;, Iterable&lt;Set&lt;E&gt;&gt; { private int minSize; private int maxSize; private E[] arr = null; private BitSet bset = null; @SuppressWarnings("unchecked") public PowerSet(Set&lt;E&gt; set, int minSize, int maxSize) { this.minSize = Math.min(minSize, set.size()); this.maxSize = Math.min(maxSize, set.size()); arr = (E[]) set.toArray(); bset = new BitSet(arr.length + 1); for (int i = 0; i &lt; minSize; i++) { bset.set(i); } } @Override public boolean hasNext() { return !bset.get(arr.length); } @Override public Set&lt;E&gt; next() { Set&lt;E&gt; returnSet = new TreeSet&lt;E&gt;(); // System.out.println(printBitSet()); for (int i = 0; i &lt; arr.length; i++) { if (bset.get(i)) { returnSet.add(arr[i]); } } int count; do { incrementBitSet(); count = countBitSet(); } while ((count &lt; minSize) || (count &gt; maxSize)); // System.out.println(returnSet); return returnSet; } protected void incrementBitSet() { for (int i = 0; i &lt; bset.size(); i++) { if (!bset.get(i)) { bset.set(i); break; } else bset.clear(i); } } protected int countBitSet() { int count = 0; for (int i = 0; i &lt; bset.size(); i++) { if (bset.get(i)) { count++; } } return count; } protected String printBitSet() { StringBuilder builder = new StringBuilder(); for (int i = 0; i &lt; bset.size(); i++) { if (bset.get(i)) { builder.append('1'); } else { builder.append('0'); } } return builder.toString(); } @Override public void remove() { throw new UnsupportedOperationException("Not Supported!"); } @Override public Iterator&lt;Set&lt;E&gt;&gt; iterator() { return this; } public static void main(String[] args) { Set&lt;Character&gt; set = new TreeSet&lt;Character&gt;(); for (int i = 0; i &lt; 7; i++) set.add((char) (i + 'A')); PowerSet&lt;Character&gt; pset = new PowerSet&lt;Character&gt;(set, 3, 5); int count = 1; for (Set&lt;Character&gt; s : pset) { System.out.println(count++ + ": " + s); } } } </code></pre> <p>And here are the test results:</p> <pre><code>1: [A, B, C] 2: [A, B, D] 3: [A, C, D] 4: [B, C, D] 5: [A, B, C, D] 6: [A, B, E] 7: [A, C, E] 8: [B, C, E] 9: [A, B, C, E] 10: [A, D, E] 11: [B, D, E] 12: [A, B, D, E] 13: [C, D, E] 14: [A, C, D, E] 15: [B, C, D, E] 16: [A, B, C, D, E] 17: [A, B, F] 18: [A, C, F] 19: [B, C, F] 20: [A, B, C, F] 21: [A, D, F] 22: [B, D, F] 23: [A, B, D, F] 24: [C, D, F] 25: [A, C, D, F] 26: [B, C, D, F] 27: [A, B, C, D, F] 28: [A, E, F] 29: [B, E, F] 30: [A, B, E, F] 31: [C, E, F] 32: [A, C, E, F] 33: [B, C, E, F] 34: [A, B, C, E, F] 35: [D, E, F] 36: [A, D, E, F] 37: [B, D, E, F] 38: [A, B, D, E, F] 39: [C, D, E, F] 40: [A, C, D, E, F] 41: [B, C, D, E, F] 42: [A, B, G] 43: [A, C, G] 44: [B, C, G] 45: [A, B, C, G] 46: [A, D, G] 47: [B, D, G] 48: [A, B, D, G] 49: [C, D, G] 50: [A, C, D, G] 51: [B, C, D, G] 52: [A, B, C, D, G] 53: [A, E, G] 54: [B, E, G] 55: [A, B, E, G] 56: [C, E, G] 57: [A, C, E, G] 58: [B, C, E, G] 59: [A, B, C, E, G] 60: [D, E, G] 61: [A, D, E, G] 62: [B, D, E, G] 63: [A, B, D, E, G] 64: [C, D, E, G] 65: [A, C, D, E, G] 66: [B, C, D, E, G] 67: [A, F, G] 68: [B, F, G] 69: [A, B, F, G] 70: [C, F, G] 71: [A, C, F, G] 72: [B, C, F, G] 73: [A, B, C, F, G] 74: [D, F, G] 75: [A, D, F, G] 76: [B, D, F, G] 77: [A, B, D, F, G] 78: [C, D, F, G] 79: [A, C, D, F, G] 80: [B, C, D, F, G] 81: [E, F, G] 82: [A, E, F, G] 83: [B, E, F, G] 84: [A, B, E, F, G] 85: [C, E, F, G] 86: [A, C, E, F, G] 87: [B, C, E, F, G] 88: [D, E, F, G] 89: [A, D, E, F, G] 90: [B, D, E, F, G] 91: [C, D, E, F, G] </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload