サブアレイの問題へのダイビング配列

レムコBravenboer:

私は、より小さなアレイに多くの数を含む配列を分割しようとしていると私はそのための2Dアレイを使用します。

以下の例では、私は16個の要素(INT []番号)を含む配列を有します。以下のコードでは、私がこれまでに作られたものが表示されます。私は4つの小さなアレイ(int型arrayAmount)に分割したい場合splitArrayが働いています。私は、2次元アレイsplittedArray全体に配列を広めるためにしようとしています。

private static final int NUMBER_COUNT = 16;
private static int threadAmount = 4;
private static int lowestNumber = Integer.MAX_VALUE;

public static void main(String[] args) {
        int[] numbers = generateNumber(NUMBER_COUNT);
        System.out.println("Original array:\n" + Arrays.toString(numbers));
        int[][] splittedArray = new int[threadAmount][(numbers.length/threadAmount)];

        // Split arrays and print them
        splitArray(threadAmount, numbers, splittedArray);
        System.out.println("\nSplit arrays:\n" + Arrays.deepToString(splittedArray));
    }

private static void splitArray(int arrayAmount, int[] numbers, int[][] splittedArray) {
        int elPerSubArr = numbers.length / arrayAmount;

        int x = 0;
        int i = x;

        if (numbers.length != 0) {
            while (i < numbers.length) {
                for (int j = 0; j < elPerSubArr; j++) {
                    splittedArray[x][j] = numbers[i];
                    i++;
                }
                x++;
            }
        } else {
            System.out.println("There are no elements inside this array!");
        }
    }

私はarrayAmountで割ったときに0%だarrayAmountと数字の長さsplitArrayメソッドを呼び出すと、今では罰金に動作します。例えば:16および4 splitArray [0]〜[3]のすべてのそのような場合に、次に4つの要素を含むことになります。

それはまた、私は15個の要素を入れたときに動作するようにどのように私は私のコードを変更することができますか?私は明らかになっていますArrayIndexOutOfBoundsException、それはループ4回を常にするので、私はsplittedArrayの値を設定する行の[X] [j]を。私は今、時間しようとしているし、それを把握することはできません。

チャールズDowbecki:

あなたは遅らせることができint[][]ますが、残りの要素に到達するまでの割り当てを。結果の最後の配列が小さくなります。

あなたの現在のことに注意してくださいますかnumbers.length / arrayAmount表現が正しい長さなどを計算しないであろう3 / 2 = 1ため、整数演算にします。あなたは使用してそれを修正することができますMath.ceil()

public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5};
    int[][] splits = splitArray(2, numbers);
    System.out.println("Split arrays: " + Arrays.deepToString(splits));
}

private static int[][] splitArray(int splitCount, int[] numbers) {
    if (numbers.length == 0) {
        return new int[0][0];
    }

    int splitLength = (int) Math.ceil((double) numbers.length / (double) splitCount);
    int[][] splits = new int[splitCount][];

    int j = 0;
    int k = 0;
    for (int i = 0; i < numbers.length; i++) {
        if (k == splitLength) {
            k = 0;
            j++;
        }
        if (splits[j] == null) {
            int remainingNumbers = numbers.length - i;
            splits[j] = new int[Math.min(remainingNumbers, splitLength)];
        }
        splits[j][k++] = numbers[i];
    }
    return splits;
}

印刷されます:

Split arrays: [[1, 2, 3], [4, 5]]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=332551&siteId=1