now correct for the general case
This commit is contained in:
parent
e92315c292
commit
4c1a6d4417
2 changed files with 67 additions and 22 deletions
|
|
@ -4,22 +4,23 @@ import java.util.ArrayList;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Makes permutations of n lists of m elements, ie:
|
||||
*
|
||||
* [A,B], [1,2] => [A,1], [A,2], [B,1], [B,2]
|
||||
*/
|
||||
public class Permuter {
|
||||
|
||||
public static List<Tuple> permute(List<List<?>> elements) {
|
||||
if (elements.size() > 2) {
|
||||
return permute(elements.get(0), elements.subList(1, elements.size() - 1));
|
||||
} else if (elements.size() == 2) {
|
||||
return permutePairs(elements.get(0), elements.get(1));
|
||||
} else
|
||||
throw new IllegalArgumentException("need at least 2");
|
||||
}
|
||||
if (elements.size() >= 2) {
|
||||
List<Tuple> result = permutePairs(elements.remove(0), elements.remove(0));
|
||||
|
||||
private static List<Tuple> permute(List<?> list, List<List<?>> elements) {
|
||||
if (elements.size() > 2) {
|
||||
return permute(elements.get(0), elements.subList(1, elements.size() - 1));
|
||||
for (List<?> element : elements) {
|
||||
result = permutePairs(element, result);
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
return permutePairs(elements.get(0), elements.get(1));
|
||||
throw new IllegalArgumentException("need at least 2");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -60,11 +61,12 @@ public class Permuter {
|
|||
add(pair.element2, list);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String string = "";
|
||||
for (Object o : this) {
|
||||
string+=o.toString()+",";
|
||||
string += o.toString() + "-";
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import org.junit.Test;
|
|||
|
||||
public class PermuterTests {
|
||||
@Test
|
||||
public void test(){
|
||||
public void testPairs() {
|
||||
List<Integer> integers = new ArrayList<>();
|
||||
integers.add(1);
|
||||
integers.add(2);
|
||||
|
|
@ -23,9 +23,52 @@ public class PermuterTests {
|
|||
outer.add(integers);
|
||||
outer.add(strings);
|
||||
List<Tuple> permuted = Permuter.permute(outer);
|
||||
assertEquals("1,A,",permuted.get(0).toString());
|
||||
assertEquals("1,B,",permuted.get(1).toString());
|
||||
assertEquals("2,A,",permuted.get(2).toString());
|
||||
assertEquals("2,B,",permuted.get(3).toString());
|
||||
assertEquals("1-A-", permuted.get(0).toString());
|
||||
assertEquals("1-B-", permuted.get(1).toString());
|
||||
assertEquals("2-A-", permuted.get(2).toString());
|
||||
assertEquals("2-B-", permuted.get(3).toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTriplets() {
|
||||
List<Integer> integers = new ArrayList<>();
|
||||
integers.add(1);
|
||||
integers.add(2);
|
||||
List<String> strings = new ArrayList<>();
|
||||
strings.add("A");
|
||||
strings.add("B");
|
||||
List<Vogon> vogons = new ArrayList<>();
|
||||
vogons.add(new Vogon("Jeltz"));
|
||||
vogons.add(new Vogon("Gummbah"));
|
||||
|
||||
List<List<?>> outer = new ArrayList<>();
|
||||
outer.add(integers);
|
||||
outer.add(strings);
|
||||
outer.add(vogons);
|
||||
|
||||
List<Tuple> permuted = Permuter.permute(outer);
|
||||
assertEquals("Vogon Jeltz-1-A-", permuted.get(0).toString());
|
||||
assertEquals("Vogon Jeltz-1-B-", permuted.get(1).toString());
|
||||
assertEquals("Vogon Jeltz-2-A-", permuted.get(2).toString());
|
||||
assertEquals("Vogon Jeltz-2-B-", permuted.get(3).toString());
|
||||
assertEquals("Vogon Gummbah-1-A-", permuted.get(4).toString());
|
||||
assertEquals("Vogon Gummbah-1-B-", permuted.get(5).toString());
|
||||
assertEquals("Vogon Gummbah-2-A-", permuted.get(6).toString());
|
||||
assertEquals("Vogon Gummbah-2-B-", permuted.get(7).toString());
|
||||
|
||||
}
|
||||
|
||||
public class Vogon {
|
||||
private String name;
|
||||
|
||||
public Vogon(String name) {
|
||||
super();
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Vogon " + name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue