目次
Pythonでデータ解析と自動化ツールを開発しています。DjangoでのWeb開発も得意です!
工作HardwareHubからのお知らせ
Item.java
メンバ変数 num
を持つ Item
を定義します。
class Item {
private int num;
public Item(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
ConcreteIterator.java、Iterator.java
後に定義する Aggregate
から値を取り出す Iterator
を定義します。
class ConcreteIterator implements Iterator {
private ConcreteAggregate concreteAggregate;
private int idx;
public ConcreteIterator(ConcreteAggregate concreteAggregate) {
this.concreteAggregate = concreteAggregate;
this.idx = 0;
}
public boolean hasNext() {
return (idx < concreteAggregate.getSize()) ? true : false;
}
public Object next() {
return concreteAggregate.getItemAt(idx++);
}
}
interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
ConcreteAggregate.java、Aggregate.java
複数の Item
を持つクラスを Aggregate
として定義します。自身を走査するための Iterator
も返せるようにします。
class ConcreteAggregate implements Aggregate {
private Item[] items;
private int size = 0;
public ConcreteAggregate(int maxSize) {
this.items = new Item[maxSize];
}
public void append(Item item) {
this.items[size++] = item;
}
public Item getItemAt(int idx) {
return items[idx];
}
public int getSize() {
return size;
}
public Iterator iterator() {
return new ConcreteIterator(this);
}
}
interface Aggregate {
public abstract Iterator iterator();
}
Main.java
Main
から、ループ処理の実装を別のクラスに切り出すことができました。
Aggregate
の実装を配列からベクターに変更した場合、Main
の改修は必要ありません。Iterator
の実装として、逆方向に走査可能なものを追加する、といった拡張も容易です。
class Main {
public static void main(String[] args) {
int n = 5;
ConcreteAggregate concreteAggregate = new ConcreteAggregate(n);
for(int i=0; i<n; ++i) concreteAggregate.append(new Item(i));
Iterator it = concreteAggregate.iterator();
while(it.hasNext()) {
Item item = (Item)it.next();
System.out.println(item.getNum());
}
}
}
出力
$ javac Main.java Item.java Aggregate.java Iterator.java ConcreteAggregate.java ConcreteIterator.java && java Main
0
1
2
3
4
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...