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.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;
}

View file

@ -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;
}
}
}