1

ほとんどの人が人のためにメソッドを書くのが好きではないことは知っていますが、誰かが私のアルゴリズムを Java コードに変換するのを手伝ってくれることを望んでいました。私のアルゴリズムが優れていて、実際に機能することを願っています。

  1. 指定された int の配列を昇順に並べ替えます。Group Limit を 15 に設定します (つまり、グループの合計が 15 を超えないことを意味します)。
  2. ソートされた配列の最初の要素を取得し、グループ (新しい配列/リスト) に挿入します。グループA。
  3. ソートされた配列の 2 番目の要素を取得し、グループの制限を超えない限り挿入します。超える場合は、新しいグループ B を作成し、そこに挿入します。
  4. 3 番目の要素を取り、次に利用可能なグループに挿入しようとします。
  5. intすべての がチェックされ、グループ化されるまで繰り返します。

入力:

egArray = [1,3,4,6,6,9,12,14]

出力:

グループ A: [1,3,4,6]、グループ B: [6,9]、グループ C: [12]、グループ D: [14]

私はこれをやろうとしましたが、コードを投稿する価値さえありませんでした。:-(

これはサンプル データであり、私が自己学習用に作成したアルゴリズムです。そのため、批判は最小限に抑えてください。過去数か月にわたって人々が書いた多くの Stackoverflow の投稿から真に学びましたが、残念ながらこの例のようなものは見つかりませんでした。ありがとう。

4

2 に答える 2

2

これを試して:

public static void main(String[] arguments) {
    int limit = 15;
    int[] egArray = new int[] { 14, 1, 3, 4, 6, 6, 9, 12 };

    ArrayList<ArrayList<Integer>> a = grouping(limit, egArray);
    System.out.println(a);
}

public static ArrayList<ArrayList<Integer>> grouping(int limit, int[] array) {
    // Sort the input array.
    Arrays.sort(array);
    // Copy the int[] to an ArrayList<Integer>
    ArrayList<Integer> input = new ArrayList<>();
    for (int i = 0; i < array.length; i++) {
        input.add(array[i]);
    }

    // Initialize the groups
    ArrayList<ArrayList<Integer>> groups = new ArrayList<>();
    groups.add(new ArrayList<Integer>());
    // Initialize the sums of the groups, to increase performance (I guess).
    ArrayList<Integer> sums = new ArrayList<>();
    sums.add(0);

    // Iterate through the input array until there is no number
    // left in it (that means we just added all the numbers
    // into our groups array).
    while (!input.isEmpty()) {
        int n = input.get(0); // Store the number to 'n', to shortcut.
        if (n > limit) {
            String msg = "number is greater than the limit; cannot add number";
            throw new IllegalArgumentException(msg);
            // Or whatever to do if the number is larger than the limit.
        }
        boolean match = false;
        // Search the next groups and check if our current
        // number ('n') fits.
        for (int i = 0; i < sums.size(); i++) {
            if (sums.get(i) + n <= limit) {
                // If it fits, then add the number to the group.
                sums.set(i, sums.get(i) + n);
                groups.get(i).add(n);
                match = true;
                break;
            }
        }
        // If 'n' doesn't fit in any group, create a new one.
        if (!match) {
            ArrayList<Integer> e = new ArrayList<>();
            e.add(n);
            groups.add(e);
            sums.add(n);
        }
        // Remove our number.
        input.remove(0);
    }
    return groups;
}

ArrayList<ArrayList<Integer>>このメソッドはではなく を返しますint[][]が、結果は同じであることに注意してください。グループの値を確認するには、main(String).

于 2012-12-01T22:06:28.713 に答える
1

この方法はどうですか?

public static ArrayList group(ArrayList<Integer> arr, Integer groupLimit) {
    ArrayList<ArrayList> result = new ArrayList<ArrayList>();
    ArrayList<Integer> temp = new ArrayList<Integer>();
    for (Integer x : arr) {
        if (sumElements(temp) + x < groupLimit) { 
            temp.add(x);
        } else {
            result.add(temp);
            temp = new ArrayList<Integer>();
            temp.add(x);
        }
    }
    if (temp.size() > 0) {
        result.add(temp);
    }
    return result;
}

public static int sumElements(ArrayList<Integer> arr) {
    Integer result = 0;
    for(Integer x:arr) result += x;
    return result;
}
于 2012-12-01T20:08:50.177 に答える