我有一个包含9个元素的数组,我希望将所有可能性分成3个。
我该怎么做?
为了更好地理解,选择9中的3,然后选择6中的3,剩下的将是最后的。有1680种可能性。我想要他们。
答案 0 :(得分:0)
这更像是一个排列问题,而不是Java问题,但基本上你可以只计算{0,1,2,3,4,5,6,7,8}的所有排列,一旦你得到排列就取了前3个作为第一个数组,第二个作为第二个数组,最后3个作为第三个数组。顺便说一句,我选择了0-8而不是1-9,因为数组索引从0开始。
例如,第一个排列是0,1,2,3,4,5,6,7,8。我把它分成三个部分/数组,[0,1,2],[3,4,5],[6,7,8]。
我并不认为这是最佳方法,或者此代码已经过优化,但这是一个有趣的谜题。 :)
public class Permutations
{
private boolean[] used;
private StringBuilder out = new StringBuilder();
private final String in;
private String[] originalArray = { "a", "b", "c", "d", "e", "f", "g", "h", "i" }; // this can be changed to any array, e.g. int[]
public static void main(String[] args)
{
Permutations p = new Permutations("012345678");
p.permute();
}
public Permutations(final String str)
{
in = str;
used = new boolean[in.length()];
}
public void permute()
{
if (out.length() == in.length())
{
System.out.println("Permutation: " + out);
loadArrays(out);
return;
}
for (int i = 0; i < in.length(); ++i)
{
if (used[i])
continue;
out.append(in.charAt(i));
used[i] = true;
permute();
used[i] = false;
out.setLength(out.length() - 1);
}
}
public void loadArrays(StringBuilder p)
{
String[] array1 = new String[3];
String[] array2 = new String[3];
String[] array3 = new String[3];
array1[0] = originalArray[Integer.parseInt(p.substring(0, 1))];
array1[1] = originalArray[Integer.parseInt(p.substring(1, 2))];
array1[2] = originalArray[Integer.parseInt(p.substring(2, 3))];
array2[0] = originalArray[Integer.parseInt(p.substring(3, 4))];
array2[1] = originalArray[Integer.parseInt(p.substring(4, 5))];
array2[2] = originalArray[Integer.parseInt(p.substring(5, 6))];
array3[0] = originalArray[Integer.parseInt(p.substring(6, 7))];
array3[1] = originalArray[Integer.parseInt(p.substring(7, 8))];
array3[2] = originalArray[Integer.parseInt(p.substring(8, 9))];
System.out.println(String.format("Array1: [%s,%s,%s]", array1[0], array1[1], array1[2]));
System.out.println(String.format("Array2: [%s,%s,%s]", array2[0], array2[1], array2[2]));
System.out.println(String.format("Array3: [%s,%s,%s]", array3[0], array3[1], array3[2]));
System.out.println();
}
}
顺便说一下,有362880种排列而不是1680. :)