配列の上位互換としてコレクション(以下Collections)がJAVAには用意されています。大変便利で配列では手間のかかることも簡単に実装することができるようになります。
Collectionsには3種類が用意されており、それぞれ特徴が異なります。
名称 | 特徴 |
---|---|
List | 中身の重複可、順番がある |
Set | 中身の重複不可 |
Map | 組み合わせで管理する |
具体例を挙げてみていきます。
ArrayList
Listの中でもっとも代表的、かつほとんどの場合において利用されるArrayListをここでは扱います。
まずは、配列とarrayListの比較です。
String配列を使った場合
String[] arrayString = new String[3]; arrayString[0] = "あいうえお"; arrayString[1] = "さしすせそ"; arrayString[2] = "なにぬねの";
arrayListを使った場合
ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("あいうえお"); arrayList.add("かきくすこ"); arrayList.add("なにぬねの");
arrayListを見て、気づくことというと、<String>という部分でしょう。こちらはArrayListに入れる型を意味します。結果、ArrayList<String>型となります。<>の中はオブジェクトの型を入れます。その上でインスタンスを管理します。
もう1点の違いとなりますと、宣言部分の違いです。配列の場合は[3]を見ても分かる通り、サイズの指定を要します。対してarrayListはサイズの指定が必要ありません。自由に追加をすることができます。
arrayListはオブジェクトを管理します。では、intやfloatのような基本データ型は管理できないのでしょうか。
ArrayListで基本データ型を管理する?
ArrayList<int> intArrayList = new ArrayList<int>(); arrayList.add(1); arrayList.add(2); arrayList.add(3);
とすればできそうに思います。しかし、ArrayListはインスタンスを格納します。ですからこのコードは使えません。AndroidStudioなら赤線が出ます。
int型を扱いたい場合はIntegerを用います。その上で以下のように書き換えます。
ArrayList<Integer> integerArrayList = new ArrayList<Integer>(); integerArrayList.add(1); integerArrayList.add(2); integerArrayList.add(3);
Integer型であるものの、add(1)とint型を入れていますが自動的に変換されますので問題ありません。
ArrayListの値を取得する
get()を用います。
ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("あいうえお"); arrayList.add("さしすせそ"); arrayList.add("なにぬねの");
において1番目の要素(0からカウントする)を取り出すコードは以下のようになります。
String s = arrayList.get(1)
Stringのsには”さしすせそ”が入ります。
ArrayListの操作 挿入 add(int n,)
arrayListには”あいうえお”、”さしすせそ”、”なにぬねの”が順番で入っています。”かきくけこ”を間に入れたいとします。今まで通りの方法でadd()を使うとすると、”なにぬねの”の後ろ、つまり3番目に入ることになります。そうではなく、0番目と1番目の間に挿入することが目的です。この場合もadd()を用いるわけですが、挿入場所を指定することができ、以下のように記述します。
arrayList.add(1,"かきくけこ");
これで1番目に”かきくけこ”が挿入されました。この場合、”さしすせそ”は1番目から2番目に押されます。上書きではありません。考えずに連続でadd(int n,)すると予期しない場所に入りますので、「押される」ということは忘れないでください。
ArrayListの操作 上書き set(int,)
では上書きはどのように書くのでしょう?set(int n,)を用います。set(int n,)はn番目の場所に上書きします。”なにぬねの”を”たちつてと”で上書きすることで順番通りに表示されるようにします。
ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("あいうえお"); //0 arrayList.add("さしすせそ"); //1 //挿入によって2へ arrayList.add("なにぬねの"); //2 //挿入によって3へ arrayList.add(1,"かきくけこ"); //1へ arrayList.set(3,"たちつてと"); //3の上書き
となります。間違えてはいけないことは”かきくけこ”が1番目に入っていることで”なにぬねの”が3番目に押されているということです。ですから2ではなく3への上書きです。(この時点では”なにぬねの”は3番目)
その他のメソッド
その他のメソッドとして以下が用意されています。
メソッド | 戻り値 | 内容 |
---|---|---|
size() | int | 要素数を取得 |
isEmpty() | boolean | 要素が0であるか |
contains(..) | boolean | ..を含むかどうか |
indexOf(..) | int | ..が何番目にあるか |
remove() | void | 要素を検索する |
crear() | ”要素”を全て削除 |
以上を踏まえたうえで、次のコードを実行するとLogcatには何が表示されるでしょうか。
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("あいうえお"); arrayList.add("さしすせそ"); arrayList.add("なにぬねの"); arrayList.add(1,"かきくけこ"); // Ope1 arrayList.set(3,"たちつてと"); // Ope2 arrayList.remove(0); //Ope3 for(int i =0 ; i<arrayList.size();i++){ Log.d("Log0",i+" : "+arrayList.get(i)); } if(arrayList.contains("なにぬねの")){ //Ope4 Log.d("Log0","なにぬねの あり"); }else{ Log.d("Log0","なにぬねの なし"); } Log.d("Log0","さしすせそは" +arrayList.indexOf("さしすせそ") +"番目です"); //Ope5 arrayList.clear(); //Ope6 if(arrayList.isEmpty()) Log.d("Log0","要素数はゼロ"); Log.d("Log0","clear後のサイズ"+arrayList.size()); } }
答えは、
Log0: 0 : かきくけこ
Log0: 1 : さしすせそ
Log0: 2 : たちつてと
Log0: なにぬねの なし
Log0: さしすせそは1番目です
Log0: 要素数はゼロ
Log0: clear後のサイズ0
となります。
0 | 1 | 2 |
あいうえお | さしすせそ | なにぬねの |
◇Ope1では1番目に、”かきくけこ”を挿入しています
0 | 1 | 2 | 3 |
あいうえお | かきくけこ | さしすせそ | なにぬねの |
◇Ope2では3番目に”たちつてと”を上書きしています。
0 | 1 | 2 | 3 |
あいうえお | かきくけこ | さしすせそ | たちつてと |
◇Ope3で0番目を削除します。後ろの要素は前に自動で詰められます。
0 | 1 | 2 |
かきくけこ | さしすせそ | たちつてと |
となります。”かきくけこ”は0番目となり、サイズも3となります。
◇Ope4で”なにぬねの”が含まれているかの判定を行いました。
”なにぬねの”は”たちつてと”に上書きされているためfalseが返されました。
◇Ope5にて”さしすせそ”が何番目にあるのか検索をしました。
◇Ope6でclear()、”要素”は全て削除されました。
要素が全て削除されたのであってarrayListが削除されたわけではありません。
こんな場合は?
さて、indexOf(..)ですが同じ要素がある場合はどうなるでしょうか。
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("あいうえお"); arrayList.add("さしすせそ"); arrayList.add("あいうえお"); Log.d("Log0","あいうえお" +arrayList.indexOf("あいうえお")+"番目です"); } }
Logcatは、”Log0: あいうえお0番目です”となります。2番目の要素である”あいうえお”を検出するには省略しますがfor文を使うなどして実現するとよいでしょう。
イテレータ
for(int i =0 ; i<arrayList.size();i++){ Log.d("Log0",arrayList.get(i)); } for(String s : arrayList){ Log.d("Log0",s); } Iterator<String> arrayListIterator = arrayList.iterator(); while(arrayListIterator.hasNext()){ Log.d("Log0",arrayListIterator.next()); }
3種類の方法で表示しましたが全て同じようにarrayListの内容を表示します。3番目のIteratorは順番に中身を取り出す働きをします。わかりにくく感じるようでしたら、理屈というよりもこのまま覚えてしまってください。hasNextで次があるかの確認をし、trueであれば表示した上で次へ、という具合です。