import java.util.*;
//die permutaions funktionen Klasse
public class Permutator
{
/*
* hier wird das ganze array p von start bis n-1 um eine stelle nach links
* verschoben. dabei wird erstmal das startelement ge- speichert, und dann
* wieder ganz hinten in das array eingefügt!
*/
private static void push(int i_startIdx, Object[] io_objects) {
Object temp = io_objects[i_startIdx - 1];
for (int i = i_startIdx - 1; i < io_objects.length - 1; i++) {
io_objects[i] = io_objects[i + 1];
}
io_objects[io_objects.length - 1] = temp;
}
/**
* This method creates a flat copy of the array
*
* @param i_objs
* @return
*/
private static Object[] copy(Object[] i_objs) {
Object[] objs = new Object[i_objs.length];
System.arraycopy(i_objs, 0, objs, 0, objs.length);
return objs;
}
/*
* dies ist die eigentliche permutations-fnkt Alle elemente werden genau so
* oft verschoben bis alle kombinationen abgearbeitet wurden! vom aktuellen
* element weg werden dann alle nachfolgenden Elemente weiterpermutiert. am
* schluss sieht die zahl dann wieder genau gleich aus, und muss daher nicht
* mehr ange- zeigt werden!
*/
private static void permu(int i_index, Object[] io_objects, ArrayList o_set) {
for (int i = i_index; i <= io_objects.length; i++) {
permu(i_index + 1, io_objects, o_set);
push(i_index, io_objects);
if (i != io_objects.length) {
o_set.add(copy(io_objects));
}
}
}
private static ArrayList permutate(Object[] i_objects) {
ArrayList set = new ArrayList();
set.add(copy(i_objects));
permu(1, copy(i_objects), set);
return set;
}
public static Object[] permutate(Object i_object, ArrayConverter i_arrayConverter)
{
Object[] array = i_arrayConverter.toArray(i_object);
ArrayList set = permutate(array);
Object[] objs = new Object[set.size()];
for (int i = 0; i < objs.length; ++i) {
Object[] a = (Object[]) set.get(i);
objs[i] = i_arrayConverter.toObject(a);
}
return objs;
}
public static void main(String[] args)
{
int[] val = new int[] { 1, 2, 3 };
Object[] obj = Permutator.permutate( val, ArrayConverterHelper.createIntegerArrayConverter() );
}
}
// hier das interface für die arrays
interface ArrayConverter
{
/**
* This method transforms an array of objects into an object.
*
* @param i_objects
* An array of objects.
* @return An object.
*/
public Object toObject(Object[] i_objects);
/**
* This method transforms an object into an array of objects.
*
* @param i_object
* The object to transform.
* @return An array of objects.
*/
public Object[] toArray(Object i_object);
}
// hier die implementierung für die Integer array Objekte
class ArrayConverterHelper
{
public static ArrayConverter createIntegerArrayConverter()
{
return new ArrayConverter()
{
/*
* (non-Javadoc)
*
* @see stuff.ArrayConverter#toObject(java.lang.Object[])
*/
public Object toObject(Object[] i_objects) {
int[] val = new int[i_objects.length];
for (int i = 0; i < val.length; ++i) {
val[i] = ((Integer) i_objects[i]).intValue();
}
return val;
}
/*
* (non-Javadoc)
*
* @see stuff.ArrayConverter#toArray(java.lang.Object)
*/
public Object[] toArray(Object i_object) {
int[] v = (int[]) i_object;
Integer[] val = new Integer[v.length];
for (int i = 0; i < val.length; ++i) {
val[i] = new Integer(v[i]);
}
return val;
}
};
}
}