2

Java で次の 2 次元配列を myMap という名前の変数に設定したとします。

1 3 1
3 2 3
1 3 1

私のプログラムの次のステップは、次のようにゼロの行と列を追加することです。

1 0 3 0 1
0 0 0 0 0
3 0 2 0 3
0 0 0 0 0
1 0 3 0 1

基本的に、前の行/列の間のスペースにゼロの配列を追加しています。次に、それらに適切な数値を入力し (私の質問とは関係ありません)、プロセス (ゼロの行/列をさらに追加する) を有限回繰り返します。

私の質問は次のとおりです-Javaでこれを行う最も簡単で効率的な方法は何ですか? 新しい 2 次元配列を作成してすべてをコピーできることはわかっていますが、これを行うためのより効率的な方法があるように感じます。私の直感では、2 次元の ArrayList の方が適している可能性があります。

また、これは重要なことです。私のプログラムが始まるとき、私はこの 2 次元配列の最大サイズを知っています。また、この例に入力した数値の対称性を期待することはできません (これらは視覚的な参考のために挿入しただけです)。

4

2 に答える 2

2

ArrayListsを使用したソリューションは次のとおりです:(テストが含まれています)

    int[][] ar = new int[][]
        {
        { 0, 1, 2 },
        { 3, 4, 5 },
        { 6, 7, 8 } };
    ArrayList<ArrayList<Integer>> a = new ArrayList<>(ar.length);
    ArrayList<Integer> blankLine = new ArrayList<>(ar.length * 2 - 1);
    for (int i = 0; i < ar.length * 2 - 1; i++)
    {
        blankLine.add(0);
    }

    for (int i = 0; i < ar.length; i++)
    {
        ArrayList<Integer> line = new ArrayList<>();
        for (int j = 0; j < ar[i].length; j++)
        {
            line.add(ar[i][j]);
            if (j != ar[i].length - 1)
                line.add(0);
        }
        a.add(line);
        if (i != ar.length - 1)
            a.add(blankLine);
    }

    for (ArrayList<Integer> b : a)
    {
        System.out.println(b);
    }

出力:

[0, 0, 1, 0, 2]
[0, 0, 0, 0, 0]
[3, 0, 4, 0, 5]
[0, 0, 0, 0, 0]
[6, 0, 7, 0, 8]
于 2012-08-10T20:44:35.627 に答える
0
  • アルゴリズム

    int[][] appendRows(int[][] bag, int[]... rows) {
        int[][] extendedBag = new int[bag.length + rows.length][];
        int i = 0;
        for (int[] row : bag)  { fillRow(extendedBag, row, i++); }
        for (int[] row : rows) { fillRow(extendedBag, row, i++); }
        return extendedBag;
    }
    
    // WHERE #fillRow(int[][], int[], int) =
    
    void fillRow(int[][] bag, int[] row, int i) {
        bag[i] = new int[row.length];
        System.arraycopy(row, 0, bag[i++], 0, row.length);
    }
    
  • デモ

    import java.util.Arrays;                                                              
    
    /** Utilities for 2D arrays. */
    public class Array2dUtils {
    
        public static void main(String[] args) {
            int[][] bag = new int[][] {
                    { 0 },
                    { 1, 1 },
                    { 2, 2, 2 }
            };
            int[] row1 = new int[] { 3, 3};
            int[] row2 = new int[] { 4 };
    
            int[][] biggerBag = appendRows(bag, row1, row2);
    
            System.out.println("Bag:\n" + toString(bag));
            System.out.println("Bigger Bag:\n" + toString(biggerBag));
        }
    
        /** Append one or more rows to a 2D array of integers. */
        public static int[][] appendRows(int[][] bag, int[]... rows) {
            int[][] extendedBag = new int[bag.length + rows.length][];
    
            int i = 0;
            for (int[] row : bag)  { fillRow(extendedBag, row, i++); }
            for (int[] row : rows) { fillRow(extendedBag, row, i++); }
    
            return extendedBag;
        }
    
        /* fill i-th item of the bag */
        private static void fillRow(int[][] bag, int[] row, int i) {
            bag[i] = new int[row.length];
            System.arraycopy(row, 0, bag[i++], 0, row.length);
        }
    
        /** Pretty-prints a 2D array of integers. */
        public static String toString(int[][] bag) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bag.length; ++i) {
                sb.append(Arrays.toString(bag[i])).append("\n");
            }
            return sb.toString();
        }
    }
    

$ javac Array2dUtils.java
$ java -cp "." Array2dUtils
Bag:
[0]
[1, 1]
[2, 2, 2]

Bigger Bag:
[0]
[1, 1]
[2, 2, 2]
[3, 3]
[4]
于 2015-11-27T10:17:05.123 に答える