3

私は自分の問題を解決するためにかなり見回してきました。私は多くの問題を解決しましたが、これはまだ私を悩ませています :S 長い間 Java プログラミング (プログラミング全般) に触れていないので、理解しておいてください! ;)

私の目標は、整数の配列から可能なすべての組み合わせを取得することです。次のコードを整数 {1, 2, 3, 4} のテスト配列に適用すると、次のようになる と 予想

れ ます 。 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));
}
4

2 に答える 2

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が気に入らない場合は、listのメソッドと、java.util.Collectionsおよびjava.util.Arraysの静的メソッドを使用して、配列からリストに簡単に変更できます。

于 2012-07-05T12:19:58.060 に答える
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
    }
}

詳細については、このリンクから入手できます: コンビナトリクス: すべての「状態」を生成する - 配列の組み合わせ

ここでも同じロジックを複製できます。

于 2012-07-05T12:04:03.520 に答える