0

私はJavaが初めてです(1か月)。以下を実行しようとして失敗しましたが、助けていただければ幸いです。私がしようとしていることは次のとおりです。

  1. Main は int 配列をメソッドperm2に渡します。
    perm2(new int[]{1,2,3});

  2. perm2はそれの順列を作成し、ArrayList に追加して返します。

これは私がこれまでに持っているものです。ご覧のとおり、順列を出力するだけです。
問題は、それらを ArrayList に追加して返すことができないことです。

public static void perm2(int[] s) {
    int N = s.length;
    int[] a = new int[N];
    for (int i = 0; i < N; i++) a[i] = s[i];
    perm2(a, N);
}
private static void perm2(int[] a, int n) {
    if (n == 1) {
        System.out.println(Arrays.toString(a));
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n-1);
        perm2(a, n-1);
        swap(a, i, n-1);
    }
}  
private static void swap(int[] a, int i, int j) {
    int c;
    c = a[i]; a[i] = a[j]; a[j] = c;
}

出力:

[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
[1, 3, 2]
[2, 1, 3]
[1, 2, 3]

で出力したくありませんsysout。int 配列の ArrayList でそれらを返したいだけです。

4

4 に答える 4

1

メインの perm メソッドからの戻り値の型List<int[]>(またはお好みで) を使用します。ArrayList<int[]>

public static List<int[]> perm2(int[] s) {
    List<int[]> permutations = new ArrayList<>();
    perm2(permutations, s.clone(), s.length);
    return permutations;
}

次に、2 番目のメソッドで、リストを別のパラメーターとして渡し、各順列を追加できるようにします。配列を複製する必要があることに注意してください。そうしないと、同じ(変更された)配列オブジェクトを何度も追加することになり、最終的な順列のみの複数のコピーのリストになります。

private static void perm2(List<int[]> permutations, int[] a, int n) {
    if (n == 1) {
        permutations.add(a.clone());
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n-1);
        perm2(permutations, a, n-1);
        swap(a, i, n-1);
    }
}

それを呼び出すには:

List<int[]> permutations = perm2(new int[] { 1, 2, 3 });

for (int[] permutation : permutations) {
    System.out.println(Arrays.toString(permutation));
}

必要ではありませんが、最初の perm2 メソッドのパラメーターを から に変更することを検討してint[] sくださいint... s。次に、明示的な配列も受け入れますが、perm2(1, 2, 3)の代わりに単純に呼び出すことができます。perm2(new int[] { 1, 2, 3 })

于 2013-10-15T10:40:21.027 に答える
0

配列とメソッドのシグネチャを返すようにメソッド perm2 を変更する必要があります。

    public static ArrayList<Integer> perm2(int[] s) {
    ArrayList<Integer> a = new ArrayList<Integer>();
    for (int i = 0; i < a.size(); i++) {
        a.add(s[i]);
    }
    perm2(a, a.size());
    return a;
}
private static void perm2(ArrayList<Integer> a, int n) {
    if (n == 1) {
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n - 1);
        perm2(a, n - 1);
        swap(a, i, n - 1);
    }
}
private static void swap(ArrayList<Integer> a, int i, int j) {
    int c;
    c = a.get(i);
    a.add(i, a.get(j));
    a.remove(i + 1);
    a.set(j, c);
}
于 2013-10-15T10:41:55.467 に答える