目次
Javaちょっとできるプログラマ。教育業界のエンジニアです。
工作HardwareHubからのお知らせ
一般にある問題を解くためのアルゴリズムは複数存在します。このアルゴリズム (Strategy) 部分をinterfaceで要請した形式に合わせて実装し、委譲を用いて分離することで状況に応じて切り替えて使用できるようにします。切り替え可能なアルゴリズム以外の部分は、委譲でアルゴリズムを利用する側に実装します。また、Mainから直接Strategyを利用することは避けましょう。
サンプルコード
ある範囲に存在する素数を以下の二つのアルゴリズムで列挙します:
- それぞれの値を一つ一つ見ていき、それが素数かどうか判断する
- エラトステネスの篩 (Sieve of Eratosthenes)
sample.java
class Sample {
public static void main(String args[]) {
int rangeTo = 100;
PrimeGenerator eachGen = new PrimeGenerator(new EachStrategy(rangeTo));
PrimeGenerator sieveGen = new PrimeGenerator(new SieveStrategy(rangeTo));
while(eachGen.hasNext()) System.out.print(eachGen.next() + " ");
System.out.println("");
while(sieveGen.hasNext()) System.out.print(sieveGen.next() + " ");
System.out.println("");
}
}
PrimeGenerator.java
class PrimeGenerator {
private Strategy strategy;
public PrimeGenerator(Strategy strategy) {this.strategy = strategy;}
public int next() {return strategy.next();}
public boolean hasNext() {return strategy.hasNext();}
}
Strategy.java
interface Strategy {
public abstract int next();
public abstract boolean hasNext();
}
EachStrategy.java
class EachStrategy implements Strategy {
private int max;
private int nextPrime;
public EachStrategy(int max) {
this.max=max;
nextPrime=2;
}
public int next() {return nextPrime++;}
public boolean hasNext() {
do {
boolean isPrime=true;
for(int i=2; i*i<=nextPrime; ++i) {
if(nextPrime%i==0) {isPrime=false; break;}
}
if(isPrime) return true;
} while(++nextPrime <= max);
return false;
}
}
SieveStrategy.java
class SieveStrategy implements Strategy {
private boolean isPrime[];
private int nextPrime;
public SieveStrategy(int max) {
this.isPrime = new boolean[max+1];
isPrime[0]=isPrime[1]=false;
for(int i=2; i<isPrime.length; ++i) isPrime[i]=true;
nextPrime=2;
}
public int next() {return nextPrime++;}
public boolean hasNext() {
while(nextPrime<isPrime.length && !isPrime[nextPrime]) ++nextPrime;
for(int i=nextPrime*2; i<isPrime.length; i+=nextPrime) isPrime[i]=false;
return (nextPrime<isPrime.length) ? true : false;
}
}
実行例
$ javac EachStrategy.java PrimeGenerator.java SieveStrategy.java Strategy.java sample.java && java Sample
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
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 自体はメモリ上に存在する...