Skip to content

Package: Kombinator

Kombinator

nameinstructionbranchcomplexitylinemethod
Kombinator(List)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
iterator()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: package util;
2:
3: import java.math.BigInteger;
4: import java.util.ArrayList;
5: import java.util.Iterator;
6: import java.util.List;
7: import java.util.NoSuchElementException;
8:
9: /**
10: * Kombinator, welcher alle Variationen des Inputs iterierbar macht.
11: *
12: * @param <E>
13: *                 Klasse der Daten, welche Kombiniert werden sollen.
14: */
15: public class Kombinator<E> implements Iterable<List<E>> {
16:
17:         private final List<E> data;
18:
19:         /**
20:          * Konstruktor eines {@link Kombinator Kombinators}. Erstellt aus einer Liste von verschiedenen Elementen alle möglichen Variationen.
21:          * <br><br>
22:          * Bsp.: input: [a, b, c] output:
23:          * <ul>
24:          * <li>[]</li>
25:          * <li>[a]</li>
26:          * <li>[b]</li>
27:          * <li>[a, b]</li>
28:          * <li>[c]</li>
29:          * <li>[a, c]</li>
30:          * <li>[b, c]</li>
31:          * <li>[a, b, c]</li>
32:          * </ul>
33:          *
34:          * @param data
35:          *                 Liste der Daten, zu welchen alle Kombinationen gebildet werden sollen.
36:          */
37:         public Kombinator(final List<E> data) {
38:                 this.data = new ArrayList<>(data);
39:         }
40:
41:         @Override
42:         public Iterator<List<E>> iterator() {
43:                 return new Iterator<List<E>>() {
44:
45:                         private BigInteger a = BigInteger.ZERO;
46:
47:                         private BigInteger b;
48:
49:                         @Override
50:                         public boolean hasNext() {
51:                                 if (this.b.equals(this.a)) {
52: this.a = BigInteger.ONE.add(this.b);
53:                                 }
54:                                 return this.a.bitLength() <= Kombinator.this.data.size();
55:                         }
56:
57:                         @Override
58:                         public List<E> next() {
59:                                 if (!this.hasNext()) {
60:                                         throw new NoSuchElementException();
61:                                 }
62: this.b = this.a;
63:                                 final List<E> rv = new ArrayList<>(this.a.bitCount());
64:                                 final int l = this.a.bitLength();
65:                                 for (int i = 0; i < l; i++) {
66:                                         if (this.a.testBit(i)) {
67:                                                 rv.add(Kombinator.this.data.get(i));
68:                                         }
69:                                 }
70:                                 return rv;
71:                         }
72:
73:                         @Override
74:                         public void remove() {
75:                                 throw new UnsupportedOperationException();
76:                         }
77:
78:                 };
79:         }
80: }