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.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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ 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);
|
||||||
|
|
@ -23,9 +23,52 @@ public class PermuterTests {
|
||||||
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue