Javaを使うなら必ず覚えておきたいデータ構造 - 配列・リスト・マップ

Javaを使う場合に必ず必要になるデータ構造 - 配列・リスト・マップの使い方について簡単に説明します。

目次

配列

配列は複数件のデータを扱うためのデータ構造です。
Javaの配列の特徴は、生成時にサイズ(格納するデータの個数)を決める必要があることです。いったん配列を生成すると、後から配列のサイズを変更することはできません。

■配列を生成する。

配列の生成は以下のように行います。

データ型[] 配列の名前 = new データ型[配列のサイズ];

配列の生成では、格納するデータの型と配列の名前と配列に格納するデータの個数(配列のサイズ)を指定します。


例えば、10個のStringを格納する配列arrayを生成するには、以下のように書きます。

String[] array = new String[10];
■配列にデータを格納する。

配列へのデータを格納は以下のように行います。

配列の名前[インデックス] = データ;

配列へのデータの格納では、配列の名前とインデックスと格納するデータを指定します。
インデックスとは配列中の位置を表す数字で、「0」以上「配列のサイズ」より小さいの数字を指定する必要があります。


例えば、配列arrayへのデータの格納は以下のようになります。この例では、配列のサイズが10なので、インデックスは0以上で9より小さくなければなりません。

array[0] = "hello";
array[1] = "world";
array[9] = "test";
■配列からデータを取得する。

配列からのデータの取得は以下のように行います。

メソッド( 配列の名前[インデックス] );
変数 = 配列の名前[インデックス];
return 配列の名前[インデックス];

配列からのデータの取得では、配列の名前とデータを取得する位置(インデックス)を指定します。インデックスの考え方は、データの格納時と同様です。
配列から取得したデータは、変数に代入したり、メソッドの引数に渡したり、メソッドの戻り値として返したりできます。


例えば、配列arrayのデータを取得して画面に表示するには、以下のように書きます。

System.out.println( array[0] );  => hello
System.out.println( array[5] );  => null
System.out.println( array[9] );  => test
■配列中のすべてのデータに同じ処理をする。

配列中のすべてのデータに同じ処理をするためには、以下のようなfor文を使用します。

for ( int i = 0; i < 配列の名前.length; ++i ) {
	配列の名前[i] = データ;
}

for ( int i = 0; i < 配列の名前.length; ++i ) {
	メソッド( 配列の名前[i] );
}

このfor文の「配列の名前.length」は配列のサイズを表します。そのため、このfor文を使えば配列中のすべてのデータに同じ処理を行えます。


例えば、サイズ10の配列arrayに10個のデータを格納するには、以下のように書きます。

for ( int i = 0; i < array.length; ++i ) {
	array[i] = "データ_" + i;
}

これは以下のように書いた場合と同じ結果になります。

array[0] = "データ_0";
array[1] = "データ_1";
array[2] = "データ_2";
array[3] = "データ_3";
array[4] = "データ_4";
array[5] = "データ_5";
array[6] = "データ_6";
array[7] = "データ_7";
array[8] = "データ_8";
array[9] = "データ_9";

もう一つ例を挙げます。配列array中のデータをすべて表示するには、以下のように書きます。

for ( int i = 0; i < array.length; ++i ) {
	System.out.println( array[i] );
}

リスト

リストもまた配列と同様に、複数件のデータを扱うためのデータ構造です。
ただし、配列と異なり、リストの生成時にサイズを決める必要はありません。リストにデータを追加する度に、リストのサイズは増えていきます。

(注) リストを使うにはimport文が必要

リストを使うには、ソースファイルの最初の方に以下のimport文が必要です。

import java.util.*;
■リストを生成する。

リストの生成は以下のように行います。

List<データ型> リストの名前 = new ArrayList<データ型>();

リストの生成では、格納するデータの型とリストの名前を指定します。サイズの指定は必須ではありません。


例えば、Stringを格納するリストlistを生成するには、以下のように書きます。

List list = new ArrayList();
■リストにデータを追加する。

リストへのデータの追加は以下のように行います。

リストの名前.add( データ );

リストへのデータの追加では、リストの名前と追加するデータを指定します。
追加のたびに、データはリストの末尾に追加され、リストのサイズが1増えます。


例えば、リストlistにデータを追加するには以下のように書きます。

list.add( "work" );
list.add( "play" );
list.add( "sleep" );
■リストからデータを取得する。

リストからのデータの取得は以下のように行います。

メソッド( list.get( インデックス ) );
変数 = list.get( インデックス );
return list.get( インデックス );

リストからのデータの取得では、リストの名前とデータを取得する位置(インデックス)を指定します。
インデックスとはリスト中の位置を表す数字で、「0」以上「リストのサイズ」より小さいの数字を指定する必要があります。
リストから取得したデータは、変数に代入したり、メソッドの引数に渡したり、メソッドの戻り値として返したりできます。


例えば、リストlistのデータを取得して画面に表示するには、以下のように書きます。

System.out.println( list.get( 0 ) ); => work
System.out.println( list.get( 1 ) ); => play
System.out.println( list.get( 2 ) ); => sleep
■リストのデータを置き換える。

リストのデータの置き換えは以下のように行います。

リストの名前.set( インデックス, 新しいデータ );

リストのデータの置き換えでは、リストの名前とデータを置き換える位置(インデックス)、新しいデータを指定します。インデックスの考え方はデータの取得と同様です。
置き換えを行うと、インデックスを使って取得できるデータが、新しいデータに変わります。


例えば、リストlistのデータを置き換えるには、以下のように書きます。

list.set( 1, "walk" )

System.out.println( list.get( 1 ) ); => walk
■リスト中のすべてのデータに同じ処理をする。

リスト中のすべてのデータに同じ処理をするためには、以下のようなfor文を使用します。

for ( int i = 0; リストの名前.size(); ++i ) {
	メソッド( リストの名前[i] );
}

このfor文の「リストの名前.size()」はリストのサイズを表します。そのため、このfor文を使えばリスト中のすべてのデータに同じ処理を行えます。


例えば、リストlist中のデータをすべて表示するには、以下のように書きます。

for ( int i = 0; i < list.size(); ++i ) {
	System.out.println( list.get( i ) );
}

これは、リストlistのサイズが3だとすれば、以下のように書いた場合と同じ結果になります。

System.out.println( list.get( 0 ) ); => hello
System.out.println( list.get( 1 ) ); => walk
System.out.println( list.get( 2 ) ); => sleep

マップ

マップとは、キーに関連付けてデータを格納するデータ構造です。
マップへのデータの格納時に、キーへの関連付けを行います。そして、マップからデータ取得時に、関連づけたキーを使用します。
説明を読むより、実際に動かした方が分かりやすいと思います。

(注) マップを使うにはimport文が必要

マップを使う場合も、ソースファイルの最初の方に以下のimport文が必要です。

import java.util.*;
■マップを生成する。

マップの生成は以下のように行います。

Map<キーのデータ型, データのデータ型> マップの名前 = new HashMap<キーのデータ型, データのデータ型>();

マップの生成では、キーとデータのデータ型ととマップの名前を指定します。


例えば、キーとデータがともにStringのマップmapを生成するには、以下のように書きます。

Map map = new HashMap();
■マップにデータを格納する。

マップへのデータの格納は以下のように行います。。

マップの名前.put( キー, データ );

マップへのデータの格納では、マップの名前とキーとデータを指定します。マップに格納したデータは、キーに関連付けられます。


例えば、マップmapにデータを格納するには、以下のように書きます。

map.put( "lemon", "黄" );
map.put( "greap", "ç´«" );
map.put( "pear", "ç·‘" );
■マップからデータを取得する。

マップからのデータの取得は以下のように行います。

メソッド( マップの名前.get( キー ) );
変数 = マップの名前.get( キー );
return マップの名前.get( キー );

マップからのデータの取得では、マップの名前とキーを指定します。キーに関連付いたデータが、マップから取得されます。
マップから取得したデータは、変数に代入したり、メソッドの引数に渡したり、メソッドの戻り値として返したりできます。
なお、キーに関連づくデータが存在しない場合、nullが返されます。


例えば、データをマップmapから取得するには、以下のように書きます。

System.out.println( map.get( "lemon" ) ); => 黄
System.out.println( map.get( "greap" ) ); => ç´«
System.out.println( map.get( "cherry" ) ); => null
■マップ中の全てのデータに同じ処理をする。

マップ中のすべてのキーとデータに同じ処理をするには、以下のようなfor文を使用します。

for ( キーのデータ型 key : マップの名前.keySet() ) {
	データのデータ型 data = マップの名前.get( key );
	
	// keyやdataを使った処理;
}

このfor文中の「マップの名前.keySet()」はマップ中の全てのキーを返すので、全てのキーについて中括弧内の処理が繰り返されます。また、中括弧内の先頭では、キーに関連づいたデータを取得しています。
そのため、このfor文を使えばマップ中のすべてのキーとデータに同じ処理をすることができます。


例えば、キーとデータの関連付けをすべて表示するには、以下のように書きます。

for ( String key : map.keySet() ) {
	String data = map.get( key );
	
	System.out.println( key + ": " + data );
}

これは、以下のように書いた場合と同じような結果になります。ただし、map.keySet()が返すキーの順序は決まっていないので、表示順序が異なることがあります。

System.out.println( "apple: " + map.get( "apple" ) ); => apple: ç·‘
System.out.println( "greap: " + map.get( "greap" ) ); => greap: ç´«
System.out.println( "strawberry: " + map.get( "strawberry" ) ); => strawberry: 赤
System.out.println( "pear: " + map.get( "pear" ) ); => pear: ç·‘
System.out.println( "lemon: " + map.get( "lemon" ) ); => lemon: 黄

アルゴリズãƒ