now correct for the general case

This commit is contained in:
shautvast 2014-07-01 23:30:58 +02:00
parent e92315c292
commit 4c1a6d4417
2 changed files with 67 additions and 22 deletions

View file

@ -4,22 +4,23 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; 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 class Permuter {
public static List<Tuple> permute(List<List<?>> elements) { public static List<Tuple> permute(List<List<?>> elements) {
if (elements.size() > 2) { if (elements.size() >= 2) {
return permute(elements.get(0), elements.subList(1, elements.size() - 1)); List<Tuple> result = permutePairs(elements.remove(0), elements.remove(0));
} else if (elements.size() == 2) {
return permutePairs(elements.get(0), elements.get(1));
} else
throw new IllegalArgumentException("need at least 2");
}
private static List<Tuple> permute(List<?> list, List<List<?>> elements) { for (List<?> element : elements) {
if (elements.size() > 2) { result = permutePairs(element, result);
return permute(elements.get(0), elements.subList(1, elements.size() - 1)); }
return result;
} else { } 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); add(pair.element2, list);
} }
} }
@Override @Override
public String toString() { public String toString() {
String string=""; String string = "";
for (Object o:this){ for (Object o : this) {
string+=o.toString()+","; string += o.toString() + "-";
} }
return string; return string;
} }

View file

@ -12,20 +12,63 @@ import org.junit.Test;
public class PermuterTests { public class PermuterTests {
@Test @Test
public void test(){ public void testPairs() {
List<Integer> integers=new ArrayList<>(); List<Integer> integers = new ArrayList<>();
integers.add(1); integers.add(1);
integers.add(2); integers.add(2);
List<String> strings=new ArrayList<>(); List<String> strings = new ArrayList<>();
strings.add("A"); strings.add("A");
strings.add("B"); strings.add("B");
List<List<?>> outer=new ArrayList<>(); List<List<?>> outer = new ArrayList<>();
outer.add(integers); outer.add(integers);
outer.add(strings); outer.add(strings);
List<Tuple> permuted = Permuter.permute(outer); List<Tuple> permuted = Permuter.permute(outer);
assertEquals("1,A,",permuted.get(0).toString()); assertEquals("1-A-", permuted.get(0).toString());
assertEquals("1,B,",permuted.get(1).toString()); assertEquals("1-B-", permuted.get(1).toString());
assertEquals("2,A,",permuted.get(2).toString()); assertEquals("2-A-", permuted.get(2).toString());
assertEquals("2,B,",permuted.get(3).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;
}
} }
} }