/【LinkedList】Javaで待ち行列を簡単に扱う!2017.03.01【LinkedList】Javaで待ち行列を簡単に扱う!Java入門TweetPocketLinkedListは、ListクラスとDequeクラスのインターフェースを実装した双方向結合リストだ。待ち行列を使った順序の管理やArrayListに比較して処理スピード速いメソッドの使用頻度が高い場合に向いている。このページではJavaのLinkedListについてまとめてみた。参考にしていただければと思う。サンプルプログラムの説明LinkedListによる配列の扱い方すべての操作は、双方向結合リストに期待されるはずの処理を実行する。リストのindexに関係する操作は、指定されたindexに近いリストの最初か終わりから横断するようになっている。Listクラスのインターフェースが実装されているので、整数のインデックス(Listの位置)で要素にアクセスできる。追加する要素は、同じ要素であってもかまわない。ArrayListと比較すると、メソッドの機能は同じでも、アクセス速度に違いがあるので注意が必要だ。Dequeクラスのインターフェースが実装されている。Queue(二つの終端がある待ち行列)を省略した名称なのだ。それは、線形コレクションで両端に要素を追加することや削除することがサポートしている。ほとんどのDequeクラスは要素の数に制限を設けない実装をしているが、このインターフェースは固定サイズ制限と同様の容量制限があるDequeをサポートしている。JavaでのLinkedListを使うための書き方の詳細を確認していこう。LinkedListクラスを使うための準備をするまず、配列に要素にアクセスするために、コンストラクタを使ってその入れ物となるLinkedListクラスのオブジェクトを生成しなければならない。そのコンストラクタの書き方の詳細を見てみよう。空のリストを生成する。要素を追加して取得するリストに要素を追加しなければ、何も始まらない。次に、追加された要素を取り出す。これが基本的なメソッドだ。それらのメソッドの詳細を見てみよう。追加するために、基本となるふたつのメソッドを紹介しよう。ひとつは、リストの最後に要素を追加するためのメソッドとリストの途中に要素を追加するためのメソッドだ。特定の要素をリストの最後に追加する。このメソッドは、addLast(E)と同じである。boolean内容リストの指定された位置に指定された要素を挿入する。挿入された位置にあった要素(もしあれば)、また、後に続く要素は右にシフトする。(それらのindexに1を加える。指定された要素が挿入されるべきindex。要素を取得するためのメソッドはひとつしかない。indexを指定して、要素を取得する。indexが範囲外なら、例外を発生させて教えてくれる。指定された位置にある要素を戻す。size())サンプルプログラムそれでは実際にサンプルプログラムで確認してみよう。要素[3]:例外発生サンプルプログラムの説明それでは簡単にプログラムの解説をしてゆこう。このプログラムは、くだものの名前を最初にふたつ追加した後、追加した要素の「りんご」と「みかん」の間に「もも」を挿入するというものだ。次に、要素を表示して確認している。このとき、存在しない要素を取得して、例外が発生することも確認している。LinkedListクラスのオブジェクト、listを生成する。listに文字列:「りんご」を追加する。listに文字列:「みかん」を追加する。listのindex:1に文字列:「もも」を追加する。listのindex:0から取得した要素を表示する。listのindex:1から取得した要素を表示する。listのindex:2から取得した要素を表示する。例外処理の開始tryを宣言する。listのindex:3から取得した要素を表示する。例外処理のcatchを宣言する。例外が発生したことを表示する。要素を検索して置換削除する要素を検索して、見つけた要素を変更することも、削除することもできる。検索方法もひとつだけではない。その詳細を見てみよう。要素を検索するためのメソッドはふたつある。リストの先頭から探すメソッドと最後から探すメソッドだ。要求に合ったものを使うようにしよう。int内容リストの中で、指定された要素が最初に見つかった位置を戻す。リストの中に見つからなかったら、-1を戻す。o.equals(get(i)))であるような要素の中で最も小さい値のインデックスiを戻す。そのようなインデックスがなければ-1を戻す。戻り値:上の記述と同じだ。int内容リストの中で、指定された要素が最後に見つかった位置を戻す。リストの中に見つからなかったら、-1を戻す。o.equals(get(i)))であるような要素の中で最も大きい値のインデックスiを戻す。そのようなインデックスがなければ-1を戻す。戻り値:上の記述と同じだ。置換すでに存在する要素を、indexを指定して置き換える。indexが範囲外なら、例外を発生させて教えてくれる。指定された要素で、リストの指定された位置にある要素を置き換える。削除するためのメソッドはいくつかあるが、その基本となるメソッドだ。戻り値に削除された要素が返されるので、確実に削除されたかどうかがわかる。指定された位置にある要素をリストから削除する。後に続く要素を左にシフトする(それらのインデックスから一つを取り去る)。size())要素を検索して置換削除するサンプルプログラムそれでは実際にサンプルプログラムで確認してみよう。要素[2]:例外発生サンプルプログラムの説明それでは簡単にプログラムの解説をしてゆこう。このプログラムは、くだものの名前を最初に3つ追加した後、追加した要素の「りんご」を「マンゴー」に置換する。次に、置換した要素を表示して置換を確認している。削除した要素は取得して、例外が発生することも確認している。LinkedListクラスのオブジェクト、listを生成する。listに文字列:「りんご」を追加する。listに文字列:「もも」を追加する。listに文字列:「みかん」を追加する。listのindex:0から取得した要素を表示する。listのindex:1から取得した要素を表示する。listのindex:2から取得した要素を表示する。listのindex:0を文字列:「マンゴー」で置換する。置換前の要素を表示する。listのindex:2を削除する。削除した要素を表示する。listのindex:0から取得した要素を表示する。listのindex:1から取得した要素を表示する。例外処理の開始tryを宣言する。listのindex:2から取得した要素を表示する。例外処理のcatchを宣言する。例外が発生したことを表示する。要素すべてに対して繰り返し処理(forEach)要素をリストからひとつひとつ取り出して、何かの処理をすることはよくある。その基本からラムダ式まで詳細を見てみよう。int内容リスト内の要素の数を返す。戻り値:リスト内の要素の数を返す。void内容すべての要素が処理されるか、actionが例外を発生させるまで、各々の要素のためのactionが実行される。実装されたクラスによって他に指定されない限り、繰り返しの順序でactionが実行される。(繰り返しの並びが特定されるならば)actionにより投げられた例外は呼び出し元に中継される。各々の要素のために実行されるべきaction。forを使ったサンプルプログラムそれでは実際にサンプルプログラムで確認してみよう。list.get(index));}}}拡張forを使ったサンプルプログラムこのプログラムが拡張forを使ったサンプルプログラムだ。要素を表示するところだけがforと違う。element);}}}forEachを使ったサンプルプログラムこのプログラムがforEachを使ったサンプルプログラムだ。要素を表示するところだけがforと違う。value));}}実行結果どのサンプルプログラムも実行結果は同じになる。要素[2]:みかんサンプルプログラムの説明それでは簡単にプログラムの解説をしてゆこう。これら3つのプログラムは、どれも同じだ。くだものの名前を3つ追加した後、forを使用してlistの要素をすべて表示している。LinkedListクラスのオブジェクト、listを生成する。listに文字列:「りんご」を追加する。listに文字列:「もも」を追加する。listに文字列:「みかん」を追加する。forを使用して、listのすべての要素をすべて表示する。要素をソートする要素をソートすることは、よくある。LinkedListは、このソートを自由に行うことのできる仕組みを持っている。Comparatorを使って、ソートで使用する比較メソッドを自由に定義できる。指定されたComparatorによって誘導された順序に応じてこのリストをソートする。リストの中の要素は、指定されたcomparatorによって相互に比較可能でなければならない。Interfaceを実装しており、要素の自然な順序付けを使用していなければなりません。e2)は、リストの中のどんな要素e1とe2に対してもClassCastExceptionを投げてはならない)このリストは、修正可能でなければならないが、サイズを変更可能である必要はない。リストの要素を比較するために使用されるCamparator。null値は、要素の自然な順序付けが使用されるべきだということを示す。サンプルプログラムこのプログラムがsortを使ったサンプルプログラムだ。要素を昇順にソートして表示している。Comparatorをラムダ式で書いているので、そのメソッド:compareを書き換えれば、ソート順を変えることができる。要素[2]:ウクライナサンプルプログラムの説明それでは簡単にプログラムの解説をしてゆこう。このプログラムは、国の名前を3つ追加した後、sortを使用してlistの要素を昇順に並べ替えている。LinkedListクラスのオブジェクト、listを生成する。comparatorを定義する。メソッド:compareを実装する。文字列が昇順になるように文字列比較を行う。listに文字列:「イタリア」を追加する。listに文字列:「ウクライナ」を追加する。listに文字列:「アメリカ」を追加する。listをソートする。listのindex:0から取得した要素を表示する。listのindex:1から取得した要素を表示する。listのindex:2から取得した要素を表示する。順序を管理する順序を管理するには、LinkedArrayに実装されたDequeのインターフェースが使える。Out)などの手法がある。このような手法を実現するリストの両端への要素の追加や削除を行うメソッドがサポートされているからだ。boolean内容リストの先頭に指定された要素を追加する。boolean内容リストの先頭に指定された要素を追加する。E内容リストの最初の要素を取り出して、削除する。リストが空ならば、nullを戻す。戻り値:上記と同じだ。E内容リストの最後の要素を取り出して、削除する。リストが空ならば、nullを戻す。戻り値:上記と同じだ。以後:1.6サンプルプログラムこのプログラムがDequeのインターフェースを使ったサンプルプログラムだ。空のエレベーターに乗った人のうちだれが先に出てくるかをシミュレーションしている。