トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> コードサンプル >> 配列に関して ※管理人のメモ用ページです。

Java - 配列

配列

1次元配列 ローカル変数内でも、自動で初期化されることに注目↓↓
import java.util.Arrays;

public class Test{
    public static void main(String args[]){

        int[] ia;                // ←もしくは int ia[] (ここだけで出力すると、初期化されていないエラー)
        ia = new int[5];

        int ia2[] = new int[5];

        int ia3[] = {0,1,2,3,4,}; // ←最後に,をつけても無視される。
                                  //   また、もし型が正しくない場合はコンパイルエラーが発生する

        System.out.println(Arrays.toString(ia));
        System.out.println(Arrays.toString(ia2));
        System.out.println(Arrays.toString(ia3));    
    }
}

--------------

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 1, 2, 3, 4]
ia.length で配列長を取得 多次元配列
import java.util.Arrays;

public class Test{
    public static void main(String args[]){

        String[][] sa;
        sa = new String[2][3];

        String[][] sa2 = new String[2][3];

        String[][] sa3 = {{"AAA","aaa","あああ"},{"BBB","bbb","いいい"}};

        System.out.println(Arrays.deepToString(sa));
        System.out.println(Arrays.deepToString(sa2));
        System.out.println(Arrays.deepToString(sa3));    
    }
}

--------------

[[null, null, null], [null, null, null]]
[[null, null, null], [null, null, null]]
[[AAA, aaa, あああ], [BBB, bbb, いいい]]
また、Javaの多次元配列は配列の配列として実装されるため、四角形の行列である必要がない。 sa[index].length で配列長取得
// 配列長
import java.util.Arrays;

public class Test{
    public static void main(String args[]){
        int[][] iarr = {{1,2,3},{10,20,30,40,50},{100,200}};
        int len = iarr.length;
        for(int i=0; i<len; i++){
            System.out.println(iarr[i].length + Arrays.toString(iarr[i]));
        }    
    }
}

--------------

3[1, 2, 3]
5[10, 20, 30, 40, 50]
2[100, 200]
※範囲を超えてアクセスすると ArrayIndexOutOfBoundsException例外発生
public class Test{
    public static void main(String args[]){
        int[] ia = new int[5];
        ia[5] = 10;
    }
}

--------------

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
        at Test.main(Test.java:4)
配列を別の変数に=で代入した場合、同じ配列を参照するだけ。 (※Javaの参照型の=は、シャローコピー)
public class Test4{
    public static void main(String args[]){
        int[] ia  = {0,1,2,3};
        int[] ia2 =  ia;
        ia[2] = 10;
        System.out.println(ia[2] + "," + ia2[2]);
    }
}

--------------

10,10

配列のコピー

配列.clone(); ⇒ 一次元配列のみディープ(?)コピー (※Object#clone();のclone()メソッドは、シャローコピー(shallow copy) ⇒ オブジェクトのメンバ変数が参照型の場合、その参照情報をコピーするだけ)
import java.util.Arrays;

public class Test{
    public static void main(String[] args){
        String[] sa = {"aaa","AAA"};
        String[][] sa2 = {{"bb","BBB","2222"},{"cccc"}};

        String[] cp = sa.clone();       // ← 一次元配列のcloneは内部でメモリ割り当てもしてくれる?
        String[][]cp2 = sa2.clone();

        cp[1] = "jjj";
        cp2[0][2] = "444";

        System.out.println(Arrays.toString(sa));
        System.out.println(Arrays.deepToString(sa2));

        System.out.println(Arrays.toString(cp));
        System.out.println(Arrays.deepToString(cp2));
    }
}

--------------

[aaa, AAA]
[[bb, BBB, 444], [cccc]]
[aaa, jjj]
[[bb, BBB, 444], [cccc]] ←注:多次元配列は、cloneメソッドではシャローコピー
System.arraycopy(fromArr,fromPos, toArr, toPos, toLen) 多次元配列の場合、シャローコピー
import java.util.Arrays;

public class Test{

    public static void arrayDump(int[] arr1, int[][] arr2){
        System.out.println("");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.deepToString(arr2));
    }

    public static void main(String[] args){

        int[]   from1 = {0,1,2,3,4,5};
        int[][] from2 = {{10,20,30,40,},{100,200}};

        int[]   to1 = new int[15];
        int[][] to2 = new int[4][4];

        arrayDump(from1, from2);

        System.arraycopy(from1, 2, to1, 7, 3);
        System.arraycopy(from2, 0, to2, 1, 2);
       
        arrayDump(to1, to2);
        
        to1[8] = 99;
        //to2[2][3] = 99;  ← rantime時にArrayIndexOutOfBoundException発生
        to2[1][3] = 99;

        arrayDump(from1, from2);
        arrayDump(to1, to2);
    }
}

--------------

[0, 1, 2, 3, 4, 5]
[[10, 20, 30, 40], [100, 200]]

[0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0]
[[0, 0, 0, 0], [10, 20, 30, 40], [100, 200], [0, 0, 0, 0]]

[0, 1, 2, 3, 4, 5]
[[10, 20, 30, 99], [100, 200]]

[0, 0, 0, 0, 0, 0, 0, 2, 99, 4, 0, 0, 0, 0, 0]
[[0, 0, 0, 0], [10, 20, 30, 99], [100, 200], [0, 0, 0, 0]]
import java.util.Arrays;

public class Test{

    public static void arrayDump(Object[] arr1, Object[][] arr2){
        System.out.println("");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.deepToString(arr2));
    }

    public static void main(String[] args){

        String[] from1    = {"aaa","AAA","111","@@@@","***","qqq"};
        String[][] from2  = {{"bb","BBB","2222"},{"cccc"},{"ddd","3333"},{"eee"},{"ffff","FFFF"}};

        arrayDump(from1, from2);

        String[] to1  = new String[4];
        String[][]to2 = new String[3][4];

        System.arraycopy(from1,  3, to1,  1, 2);
        //System.arraycopy(from2, 0, to2, 2, 5); ← rantime時にArrayIndexOutOfBoundException発生
        System.arraycopy(from2, 0, to2, 2, 1); 

        arrayDump(to1, to2);
        
        to1[1] = "this is to1";
        to2[2][2] = "this is to2";

        arrayDump(from1, from2);
        arrayDump(to1, to2);
    }
}

--------------

[aaa, AAA, 111, @@@@, ***, qqq]
[[bb, BBB, 2222], [cccc], [ddd, 3333], [eee], [ffff, FFFF]]

[null, @@@@, ***, null]
[[null, null, null, null], [null, null, null, null], [bb, BBB, 2222]]

[aaa, AAA, 111, @@@@, ***, qqq]
[[bb, BBB, this is to2], [cccc], [ddd, 3333], [eee], [ffff, FFFF]]

[null, this is to1, ***, null]
[[null, null, null, null], [null, null, null, null], [bb, BBB, this is to2]]
Arrays.copyOf(fromArr, len) 多次元配列はだめ。
import java.util.Arrays;

public class Test{

    public static void arrayDump(int[] arr, int[] arr1, int[] arr2){
        System.out.println("");
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }

    public static void main(String[] args){
        int[] from1 = {0,1,2,3,4,5};
        int[] to1 = new int[10];

         to1       = Arrays.copyOf(from1,3);
        int[] to2 = Arrays.copyOf(from1,3);

        arrayDump(from1, to1, to2);

        to1[1]  = 99;

        arrayDump(from1, to1, to2);
    }
}
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。