【Java】配列/List/Mapのループ方法まとめ

プログラミング

Javaで静的配列ListMapをループして処理する機会は多々あると思います。ここではそれぞれのループの方法をいくつか紹介していきます。

どのループを使うかは状況によって判断してください。

静的配列

for文

最も一般的な方法です。配列のインデックスを指定することにより、配列の要素を取得します。

ループの終了条件は、配列のlengthプロパティによって指定します。

int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length; i++) {
  System.out.println(array[i]);
}

//-- output --
// 1
// 2
// 3
// 4
// 5

while文

静的配列でwhile文を使うことはほとんどないです。使うとすると、通常のfor文同様インデックス指定により、配列の要素を取得します。

int[] array = {1, 2, 3, 4, 5};
int i = -1;
while (++i < array.length) {
  System.out.println(array[i]);
}

//-- output --
// 1
// 2
// 3
// 4
// 5

拡張for文

配列のインデックスは使わず、格納されている順に要素を取得します。インデックスが必要な場合は、素直に通常のfor文を使うほうがよいでしょう。

int[] array = {1, 2, 3, 4, 5};
for (int elm : array) {
  System.out.println(elm);
}

//-- output --
// 1
// 2
// 3
// 4
// 5

List

for文

基本的な考え方は静的配列と同じです。ただし、終了条件に使用するのはsizeメソッドになります。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
for (int i = 0; i < list.size(); i++) {
  System.out.printn(list.get(i));
}

Iterator

Iterator(イテレータ)は、ListやMapなどを格納された順に処理したい場合に使用するインターフェースです。

hasNextメソッドで次の要素があるか判断し、nextメソッドで次の要素を取得します。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
  System.out.println(iterator.next());
}

//-- output --
// 1
// 2
// 3
// 4
// 5

拡張for文

静的配列同様、要素を格納された順に取得します。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
for (int elm : list) {
  System.out.println(elm);
}

forEach

forEachとラムダ式を使うことで、格納された順に要素を取得できます。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.forEach(elm -> {
  System.out.println(elm);
});

ただし、ラムダ式を使う場合は、その中で例外を処理する必要があります。ラムダ式外で例外を検知する場合には工夫が必要になります。

list.forEach(elm -> { 
  try {

  } catch (Exception e) {
    //例外はここで処理する必要がある
  }
});

Map

for文・拡張for文

Mapにはキーのリストを取得するkeySetメソッドと値のリストを取得するvaluesメソッドがあります。

※正確にはCollectionを返します。

必要な方のリストを取得し、あとはリストのループ方法と同じです。

Map<Integer. String> map = new HashMap<Integer, String>() {
  {
    put(15, "c");
    put(20, "d");
    put(5,  "b");
    put(1,  "a");
    put(35, "e");
  }
};
for (int key : map.keySet()) {
  System.out.println(String.format("%d, %s", key, map.get(key)));
}

forEach

MapもList同様forEachとラムダ式によるループが可能です。Listは要素をラムダ式で指定するのに対し、Mapはキーと値のセットを指定します。

Map<Integer, String> map = new HashMap<Integer, String>() {
  {
    put(15, "c");
    put(20, "d");
    put(5,  "b");
    put(1,  "a");
    put(35, "e");
  }
};
map.forEach((key, value) -> {
  System.out.println(String.format("%d, %s", key, value));
});

Listの場合と同様に、例外の処理には注意しましょう。

Mapの種類と順序について

Mapは種類によってループ時の出力順序が異なります。

HashMap

出力順序が保証されていません。そのため順序が重要な場面では不向きです。

Map<Integer. String> map = new HashMap<Integer, String>() {
  {
    put(15, "c");
    put(20, "d");
    put(5,  "b");
    put(1,  "a");
    put(35, "e");
  }
};
for (int key : map.keySet()) {
  System.out.println(String.format("%d, %s", key, map.get(key)));
}

//-- output --
// 1, a
// 35, e
// 20, d
// 5, b
// 15, c

LinkedHashMap

格納された順に出力します。

Map<Integer. String> map = new LinkedHashMap<Integer, String>() {
  {
    put(15, "c");
    put(20, "d");
    put(5,  "b");
    put(1,  "a");
    put(35, "e");
  }
};
for (int key : map.keySet()) {
  System.out.println(String.format("%d, %s", key, map.get(key)));
}

//-- output --
// 15, c
// 20, d
// 5, b
// 1, a
// 35, e

TreeMap

キーの昇順に出力します。キーの順序はComparableの実装によって決まります。

Map<Integer, String> map = new TreeMap<Integer, String>() {
  {
    put(15, "c");
    put(20, "d");
    put(5,  "b");
    put(1,  "a");
    put(35, "e");
  }
};
for (int key : map.keySet()) {
  System.out.println(String.format("%d, %s", key, map.get(key)));
}

//-- output --
// 1, a
// 5, b
// 15, c
// 20, d
// 35, e

 

- Javaのおすすめ書籍はコチラ -

コメント

タイトルとURLをコピーしました