此处描述的任务Creating combination of numbers或此处Permutations of integer array algorithm。
我决定用这种方式解决这个问题: 从第一个数字到最后一个检查排列的可能性:
创建第一个排列和差异的arraLists
del1
和rem0
Bool
是一个包含两个参数的对象:st
- start和end
这是新的排列
我创建了新的Bool,它在开始时具有相同的开始和结束,就像它是一个数字一样。所以,在用另一个起始编号开始新的排列之前,我们不能再使用这个数字了。我们将其从数字列表rem
中删除。并通过检查开始创建排列。
for (int index = 0; index < arr.length; index++) {
List<Integer> del1 = new ArrayList<Integer>();
List<Integer> rem0 = new ArrayList<Integer>();
for (int i = 0; i < del.length; i++) {
del1.add(del[i]);
}
for (int i = 0; i < arr.length; i++) {
rem0.add(arr[i]);
}
Bool start = new Bool(arr[index], arr[index]);
rem0.remove(index);
check(start, del1, rem0);
}
检查:
ucet
- “好”排列的数量,如果新排列的差异是相同的,那么第一个就是“好”。
所以,我为结尾数字添加差异编号,如果它=可能数字列表中的数字 - 我将此数字添加到排列结束,将其从可能列表中删除并删除差异列表差异(通过创建新列表)。 然后继续创建。
private static void check(Bool start, List<Integer> del2, List<Integer> rem) {
if (del2.isEmpty()) {
ucet++;
}
for (int index = 0; index<rem.size(); index++) {
for (int i = 0; i<del2.size(); i++) {
if(start.end+del2.get(i)==rem.get(index)){
List<Integer> del3 = new ArrayList<Integer>();
List<Integer> rem2 = new ArrayList<Integer>();
del3=del2;rem2=rem;
Bool con=new Bool(start.st,rem.get(index));
rem2.remove(index);
del3.remove(i);
check(con,del3,rem2);
}
}
}
}
但我有一个错误,我无法理解。它的IndexOutOfBoundsException
。在字符串if(start.end+del2.get(i)==rem.get(index)){
中。
它导致del2.get(i)
。
但问题是,i<del2.size()
。
答案 0 :(得分:0)
当您循环播放实体时,您正在从列表中删除实体,这并不好。您可以尝试将while循环与iterable.hasNext()
结合使用,或者代替rem0.remove(index)
执行rem0.set(index, null)
。