#はじめに
JavaのArrayとかArrayListの動きがよく分かってなかったので、よく使いそうな部分をまとめてみました
#サンプルコード
Main1ではArray、Main2ではArrayListの基本的な作成方法とか値の取得方法を記述してます
Main3、Main4ではそれぞれの多次元配列について記述してます
###Main1
Main1.java
import java.util.Arrays;
/**
* Created 2017/05/24.
* Main1では通常のArrayの挙動一覧
*/
public class Main1 {
public static void main(String[] args) {
//配列の作成の仕方
//宣言方法その1
//配列の型と名前を宣言
//int[] num;
//使う領域を確保する
//num = new int[3];
//宣言方法その2
//上のやり方を同時に行う方法
int[] num = new int[3];
//配列への格納
num[0] = 1;
num[1] = 2;
num[2] = 3;
//作成から格納までまとめてやる場合
// int[] num = {1, 2, 3};
//配列の取り出し
System.out.println(num[0]);
//実行結果:1
//まとめて全部取り出す方法
// 通常のfor文でループさせる場合
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
//実行結果:1 2 3
}
System.out.println(" "); //実行後の見栄えのために入れてます
//拡張for文を使う場合
for (int value : num) {
//valueは任意の変数名,普通のforとは異なり、変数名をそのまま使う
System.out.print(value + " ");
//実行結果:1 2 3
}
System.out.println(" "); //同上
//配列の中身を一括で表示する方法(Rubyで言うpメソッド的なやつ)
// Arrays.toStringを使うと良い感じに出る
//使用時の注意として、使う際はimport java.util.Arrays;の宣言が必要な事
//もう一つは対象の配列が多次元配列の場合、Arrays.deepToStringと書かないといけない
System.out.println(Arrays.toString(num));
//実行結果:[1, 2, 3]
//こうやって書くと謎の文字列になる
System.out.println(num);
//実行結果:[I@1540e19d
//補則とか色々
//Arrayでは最初に宣言した要素数を超えて格納することは出来ない
//num[3] = 4; //配列の4番目に4を格納するように書いても意味が無く、実際には入らない
//System.out.println(num[3]);
//挙動としてはコンパイルエラーは出ないが実行にエラーが出る
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3という風に怒られる
//また配列への格納宣言をしてない所、例えばnum[5]やnum[6]の値を表示させようとした場合にも同じエラーが出る
}
}
実行結果
Main1.Java
1
1 2 3
1 2 3
[1, 2, 3]
[I@1540e19d
###Main2
Main2.java
import java.util.ArrayList;
/**
* Created 2017/05/24.
* Main2ではArraysListの通常挙動について記載
*/
public class Main2 {
public static void main(String[] args) {
//ArrayListの作成方法
//基本的な宣言
//ArrayList<Integer> num = new ArrayList<Integer>();
//JavaSE7以降の定義例
ArrayList<Integer> num = new ArrayList<>();
//補足
//new ArrayList<>();の()は、数値を入れることで、配列の初期サイズを決めることが出来る
//格納方法
//addメソッドを使う
//書き方としてはadd(格納したいデータ)、またはadd(インデックス(格納する位置),格納したいデータ)で記述する
//基本的に順番に格納されていく
//インデックス指定した際に、既に値が存在している場合,値を上書きするのではなく、一つ横にずれるように格納されるので注意
num.add(1);
num.add(1, 2);
num.add(3);
//num.add(2,4);
//このように追記した場合、[1,2,4]でなく、[1,2,4,3]という配列になるので注意すること
//もし値を更新する場合はnum.set(2,4);のように、.set()を使うと[1.2,4]が得られる
//値の取り出し
//get()メソッドを使う
System.out.println(num.get(0));
//実行結果:1
//まとめ手取り出す
//for文
//ArrayListの場合は、要素数を得るには.size()を使う
for (int i = 0; i < num.size(); i++) {
System.out.print(num.get(i) + " ");
//実行結果:1 2 3
}
System.out.println(" ");
//拡張for文
for (int value : num) {
System.out.print(value + " ");
//実行結果:1 2 3
}
System.out.println(" ");
//pメソッドのように一括表示する際は、そのままprintlnに突っ込めば良い
System.out.println(num);
//実行結果:[1, 2, 3]
}
}
実行結果
Main2.java
1
1 2 3
1 2 3
[1, 2, 3]
###Main3
Main3.java
import java.util.Arrays;
/**
* Created 2017/05/24.
* Main3では通常のArrayにおける、多次元配列を作成した時の挙動一覧
*/
public class Main3 {
public static void main(String[] args){
//宣言と作成
int [][] num = new int[2][3];
//値の格納
num[0][0] = 1;
num[0][1] = 2;
num[0][2] = 3;
num[1][0] = 10;
num[1][1] = 11;
num[1][2] = 12;
//値の取り出し方
System.out.println(num[0][0]);
//実行結果:1
System.out.println(num[1][2]);
//実行結果:12
//まとめて全部取り出す場合
//forを使って2重ループさせる
//iはnum全体の要素数、num.lengthでループ
for(int i = 0; i < num.length; i++){
//jは各配列の要素数、num[i].lengthまでループ
for(int j = 0; j < num[i].length;j++){
System.out.print(num[i][j] + " ");
//実行結果:1 2 3 10 11 12
}
}
System.out.println(" ");
//拡張forの場合
//こちらも2重ループで書く
//取り出すデータとして配列を指定する
for(int[] index : num) {
//次にその配列から中身を取り出す形にする
for (int element : index) {
System.out.print(element + " ");
//実行結果:1 2 3 10 11 12
}
}
System.out.println(" ");
//一括表示
//多次元配列の場合はArrays.deepToString();を使う
System.out.println(Arrays.deepToString(num));
//実行結果:[[1, 2, 3], [10, 11, 12]]
}
}
実行結果
Main3.java
1
12
1 2 3 10 11 12
1 2 3 10 11 12
[[1, 2, 3], [10, 11, 12]]
###Main4
Main4.java
import java.util.ArrayList;
/**
* Created 2017/05/24.
* * Main4ではArraysListの多次元での挙動について記載
* 理解は出来るけど、扱い辛い
*/
public class Main4 {
public static void main(String[] args){
//二次元のArrayListの作り方
//まずは普通のArrayListを2つ作成)
ArrayList<Integer> num1 = new ArrayList();
num1.add(1);
num1.add(2);
num1.add(3);
System.out.println(num1);
//実行結果:[1, 2, 3]
ArrayList<Integer> num2 = new ArrayList<Integer>();
num2.add(10);
num2.add(11);
num2.add(12);
System.out.println(num2);
//実行結果:[10, 11, 12]
//次に格納するArrayListを作成します、宣言するデータ型に注目
//データ型の宣言時に、格納するデータは「ArrayList<Integer>を格納します!」と宣言すれば入れられる
ArrayList<ArrayList<Integer>> num_list =new ArrayList<>();
num_list.add(num1);
num_list.add(num2);
//取り出し方
//.get().get()で取り出し
System.out.println(num_list.get(0).get(0));
//実行結果:1
System.out.println(num_list.get(0).get(2));
//実行結果:3
System.out.println(num_list.get(1).get(0));
//実行結果:10
//全部取り出す
//for
//iはnum全体の要素数、num.size()でループ
for(int i = 0; i < num_list.size(); i++){
//jは各配列の要素数、num[i].size(()までループ
for(int j = 0; j < num_list.get(i).size();j++){
System.out.print(num_list.get(i).get(j) + " ");
//実行結果:1 2 3 10 11 12
}
}
System.out.println(" ");
//拡張for
//変数宣言でArrayList<Integer> +変数名で宣言すれば、値を引っ張ることが出来る!
for(ArrayList<Integer> index : num_list) {
//後は普通の拡張for文で記載
for (int element : index) {
System.out.print(element + " ");
//実行結果:1 2 3 10 11 12
}
}
System.out.println(" ");
//一括表示
System.out.println(num_list);
//実行結果:[[1, 2, 3], [10, 11, 12]]
//値の追加方法
//.add()を使用すればで良いが、各配列ごとに追加、あるいは新規に配列を作成して追加するしかない?
//num_list.add()の形で直接追加してみたいけど、結局分からず
num1.add(4);
num2.add(13);
//新規の配列追加
ArrayList<Integer> num3 = new ArrayList<Integer>();
num3.add(20);
num3.add(21);
num3.add(22);
num_list.add(num3);
System.out.println(num_list);
//実行結果[[1, 2, 3, 4], [10, 11, 12, 13], [20, 21, 22]]
}
}
実行結果
Main4.java
[1, 2, 3]
[10, 11, 12]
1
3
10
1 2 3 10 11 12
1 2 3 10 11 12
[[1, 2, 3], [10, 11, 12]]
[[1, 2, 3, 4], [10, 11, 12, 13], [20, 21, 22]]
#所感
元々Rubyをやっていたので、ArrayListのような可変長配列の方が直感的に使いやすかったのですが
多次元配列になるとArrayListはごちゃごちゃで今一分かり辛くなるっていう印象です
まだまだこの二つの使い分けとかが分かってないので、しっかりと勉強していきたいと思います