我一直在四处寻找解决我的问题。我解决了很多问题,但是这个问题仍然困扰着我:S很长一段时间我没有接触过Java编程(一般的编程)所以请在那里理解! ;)
我的目标是从整数数组中获得所有组合。当我使用以下代码,应用于整数{1,2,3,4}的测试数组时,我希望:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
2 1 3 4
2 1 4 3
(...)
但这是我得到的
1 2 3 4
1 2 3 4 4 3
1 2 3 4 4 3 3 2 4
有人有线索,建议甚至是解决方案吗?提前谢谢!
public class Calculation{
(...)
public void Permute(ArrayList<Integer> soFar,ArrayList<Integer> rest){
if(rest.isEmpty()) this.fillMatrice(convertIntegers(soFar)); // there it goes in a previously created arrow of int
else{
for(int k=0;k<rest.size();k++){
ArrayList<Integer> next=new ArrayList<Integer>();
next=soFar;
next.add(rest.get(k));
ArrayList<Integer> remaining=new ArrayList<Integer>();
List<Integer> sublist = rest.subList(0, k);
for(int a=0;a<sublist.size();a++) remaining.add(sublist.get(a));
sublist = rest.subList(k+1,rest.size());
for(int a=0;a<sublist.size();a++) remaining.add(sublist.get(a));
Permute(next,remaining);
}
}
}
public static ArrayList<Integer> convertArray(int[] integers){
ArrayList<Integer> convArray=new ArrayList<Integer>();
for(int i=0;i<integers.length;i++) convArray.add(integers[i]);
return convArray;
}
public static int[] convertIntegers(List<Integer> integers){
int[] ret = new int[integers.size()];
for(int i=0;i<ret.length;i++) ret[i]=integers.get(i).intValue();
return ret;
}
public Calculation() {
(...)
ArrayList<Integer> soFar=new ArrayList<Integer>();
int[] test={1,2,3,4};
Permute(soFar,convertArray(test));
}
答案 0 :(得分:5)
尝试这个,似乎有用,它使用递归。
public class Permute {
public static List<List<Integer>> permute(Integer...myInts){
if(myInts.length==1){
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(myInts[0]);
List<List<Integer> > listOfList = new ArrayList<List<Integer>>();
listOfList.add(arrayList);
return listOfList;
}
Set<Integer> setOf = new HashSet<Integer>(Arrays.asList(myInts));
List<List<Integer>> listOfLists = new ArrayList<List<Integer>>();
for(Integer i: myInts){
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(i);
Set<Integer> setOfCopied = new HashSet<Integer>();
setOfCopied.addAll(setOf);
setOfCopied.remove(i);
Integer[] isttt = new Integer[setOfCopied.size()];
setOfCopied.toArray(isttt);
List<List<Integer>> permute = permute(isttt);
Iterator<List<Integer>> iterator = permute.iterator();
while (iterator.hasNext()) {
List<java.lang.Integer> list = iterator.next();
list.add(i);
listOfLists.add(list);
}
}
return listOfLists;
}
public static void main(String[] args) {
List<List<Integer>> permute = permute(1,2,3,4);
System.out.println(permute);
}
}
如果你不喜欢List&gt;您可以使用java.util.Collections和java.util.Arrays中列表和静态方法中的方法轻松地从数组更改为列表。
答案 1 :(得分:2)
您可以尝试Recursion
来解决此问题:
public static void printPermutations(int[] n, int[] Nr, int idx) {
if (idx == n.length) { //stop condition for the recursion [base clause]
System.out.println(Arrays.toString(n));
return;
}
for (int i = 0; i <= Nr[idx]; i++) {
n[idx] = i;
printPermutations(n, Nr, idx+1); //recursive invokation, for next elements
}
}
可以从此链接获得更多信息: Combinatorics: generate all “states” - array combinations
你也可以在这里复制相同的逻辑。