SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

作って覚えるJavaプログラミングのススメ

Java入門 (7) - List・Map・Setなどのコレクション・フレームワーク

作って覚えるJavaプログラミングのススメ 第7回

LIFOを管理するStackクラス

 この他にも、Javaには多数のオブジェクトを扱うためのクラスがあります。中でも、やや特殊な使われ方をするものとして「Stack」クラスについても紹介しておきましょう。このStackは、正確にはコレクション・フレームワークのクラスではないのですが、「多数のオブジェクトを扱うためのもの」としてここでまとめて覚えておいてください。

 Stackは、「LIFO(Last In First Out、後入れ先出し)」を実現するためのものです。例えば、「A」「B」「C」といった値を順に収めていったとき、そこから値を順に取り出してみると今度は「C」「B」「A」というように、後から入れたものから順に取り出されていく、これがLIFOです。

値を保管する
[Stack].push( オブジェクト );
値を取り出す
Object 変数 = [Stack].pop();
Stackが空かどうか調べる
boolean 変数 = [Stack].empty();

 このStackにもaddやremoveのメソッドはあるのですが、これらは「使ってはいけない」と考えてください。なぜなら、これらを使用してしまうと、LIFOのデータの構造が崩れ、並び順が保障されなくなる可能性があるからです。Stackはpushで保管し、popで取り出すのが基本です。

package codezine.java;

import java.util.*;

public class Sample {
    
    public static void main(String[] args) {
        Stack stack = new Stack();
        System.out.print("PUSH: ");
        for(int i = 0;i < 10;i++){
            System.out.print(i + " ");
            stack.push(i);
        }
        System.out.println();
        System.out.print("POP: ");
        while(!stack.empty()){
            try {
                Object obj = stack.pop();
                System.out.print(obj + " ");
            } catch(EmptyStackException ex){
                break;
            }
        }
        System.out.println();
    }
}
実行すると、pushした値が、後のものから順に取り出されていくのが分かる。
実行すると、pushした値が、後のものから順に取り出されていくのが分かる。

 ここでは、0~9の値をpushで保管し、それをpopで空になるまで取り出して表示しています。収めた順と、取り出される順が逆になっていることがよく分かるでしょう。

 ここでのポイントは値の取出しです。whileでstack.empty()をチェックして、これがtrueになるまで繰り返しを続けます。この他、あまり一般的ではないですが「popしてエラーになったら繰り返しを抜け出す」という処理も入れておきました。popは、既に中身が空になった状態で実行されると、EmptyStackExceptionという例外を発生します。それを利用して、catchでbreakして繰り返しを抜けています。

 今回はwhileでチェックをしているのでこの処理は不要なのですが、例えばpushとpopが入り乱れているような処理では、「pop時の例外をチェックする」というやり方も覚えておくと便利でしょう。

まとめ

 今回は、コレクション・フレームワークの主なクラスについてその働きと使い方を説明しました。正直いって「配列ぐらいしか使わないんじゃないかな」なんて思っている人もいるのではないでしょうか。

 コレクション・フレームワークは、非常に地味なライブラリです。似たようなクラスがたくさんあり、それぞれ微妙に動作が違うので、なんとなく勉強するのも面倒な感じがするかもしれません。

 ところが、コレクション・フレームワークは、実にさまざまなところで使われているのです。多数のオブジェクトを管理するようなシーンで、コレクション関係のクラスは必ずといっていいほど使われています。特に、SwingなどのGUIを利用するようになると、オブジェクト類を管理するのにここで登場したクラスは多用することになります。

 まずは、基本中の基本であり、最も汎用性の高いArrayListあたりを使って、コレクションの考え方に慣れておきましょう。こうした「地味だが基礎的なクラス類」が自在に使えるようになることで、Swingなどの高度な機能も次第に抵抗なく使えるようになってくるのですから。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
作って覚えるJavaプログラミングのススメ連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2385 2008/04/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー