「Strategy パターン」の版間の差分
ナビゲーションに移動
検索に移動
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | ==Strategy パターン== | + | ==[[Strategy パターン]]== |
− | [[Java]] | + | [[Java]] | [[Category:アルゴリズム]] |
− | * | + | *[[アルゴリズム]]をカプセル化して、それらを交換可能にする。 |
− | * | + | *[[アルゴリズム]]を、利用するクライアントから独立に変更することができるようになる |
package strategy; | package strategy; | ||
− | import java.io. | + | import java.io.Buffered[[R]]eader; |
− | import java.io. | + | import java.io.File[[R]]eader; |
import java.io.IOException; | import java.io.IOException; | ||
import java.io.PrintWriter; | import java.io.PrintWriter; | ||
14行目: | 14行目: | ||
/** | /** | ||
− | * Strategy パターン | + | * [[Strategy パターン]] |
− | * | + | * [[アルゴリズム]]をカプセル化して、それらを交換可能にする。 |
− | * | + | * [[アルゴリズム]]を、利用するクライアントから独立に変更することができるようになる |
* | * | ||
* Strategy クラス | * Strategy クラス | ||
− | * | + | * サポートするすべての[[アルゴリズム]]に共通のインタフェースを宣言 |
* ・ Sorter | * ・ Sorter | ||
* | * | ||
* ConcreteStrategy クラス | * ConcreteStrategy クラス | ||
− | * Strategy | + | * Strategy クラスのインタフェースを利用して、[[アルゴリズム]]を実装 |
* ・ MargeSorter | * ・ MargeSorter | ||
* ・ InsertionSorter | * ・ InsertionSorter | ||
38行目: | 38行目: | ||
String fileName = "c:\\work\\sort\\test.txt"; | String fileName = "c:\\work\\sort\\test.txt"; | ||
String outName = "c:\\work\\sort\\test.sort.txt"; | String outName = "c:\\work\\sort\\test.sort.txt"; | ||
− | + | Buffered[[R]]eader reader = null; | |
PrintWriter writer = null; | PrintWriter writer = null; | ||
String line = null; | String line = null; | ||
45行目: | 45行目: | ||
try { | try { | ||
List<String> buf = new ArrayList<String>(); | List<String> buf = new ArrayList<String>(); | ||
− | reader = new | + | reader = new Buffered[[R]]eader(new File[[R]]eader(fileName)); |
while ((line = reader.readLine()) != null) { | while ((line = reader.readLine()) != null) { | ||
buf.add(line); | buf.add(line); | ||
54行目: | 54行目: | ||
st = System.currentTimeMillis(); | st = System.currentTimeMillis(); | ||
− | // | + | // [[アルゴリズム]]の交換 |
SortContext srt = new SortContext(new MargeSorter()); | SortContext srt = new SortContext(new MargeSorter()); | ||
// SortContext srt = new SortContext(new InsertionSorter()); | // SortContext srt = new SortContext(new InsertionSorter()); | ||
94行目: | 94行目: | ||
} | } | ||
/** | /** | ||
− | * マージソート | + | * [[マージソート]] |
*/ | */ | ||
class MargeSorter extends Sorter { | class MargeSorter extends Sorter { | ||
133行目: | 133行目: | ||
} | } | ||
/** | /** | ||
− | * 挿入ソート | + | * [[挿入ソート]] |
*/ | */ | ||
class InsertionSorter extends Sorter { | class InsertionSorter extends Sorter { |
2020年2月16日 (日) 04:32時点における最新版
Strategy パターン
Java |
package strategy; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; /** * Strategy パターン * アルゴリズムをカプセル化して、それらを交換可能にする。 * アルゴリズムを、利用するクライアントから独立に変更することができるようになる * * Strategy クラス * サポートするすべてのアルゴリズムに共通のインタフェースを宣言 * ・ Sorter * * ConcreteStrategy クラス * Strategy クラスのインタフェースを利用して、アルゴリズムを実装 * ・ MargeSorter * ・ InsertionSorter * ・ BubbleSorter * * Context クラス * ConcreteStrategy オブジェクトを備えている * Strategy のオブジェクトに対する参照を保持 * ・ SortContext * */ public class Strategy { public static void main(String[] args) { String fileName = "c:\\work\\sort\\test.txt"; String outName = "c:\\work\\sort\\test.sort.txt"; BufferedReader reader = null; PrintWriter writer = null; String line = null; long st = 0; long et = 0; try { List<String> buf = new ArrayList<String>(); reader = new BufferedReader(new FileReader(fileName)); while ((line = reader.readLine()) != null) { buf.add(line); } String[] ary = new String[buf.size()]; buf.toArray(ary); st = System.currentTimeMillis(); // アルゴリズムの交換 SortContext srt = new SortContext(new MargeSorter()); // SortContext srt = new SortContext(new InsertionSorter()); // SortContext srt = new SortContext(new BubbleSorter()); ary = srt.sort(ary); et = System.currentTimeMillis(); System.out.format("%d msec.", et - st); writer = new PrintWriter(outName); for (String s : ary) { writer.println(s); } } catch (Exception e) { e.printStackTrace(); } finally { try { reader.close(); writer.close(); } catch (IOException e) {} } } } class SortContext { private Sorter sorter; public SortContext(Sorter sorter) { this.sorter = sorter; } public String[] sort(String[] text) { return sorter.sort(text); } } /** * */ abstract class Sorter { public abstract String[] sort(String[] text); } /** * マージソート */ class MargeSorter extends Sorter { @Override public String[] sort(String[] text) { if (text.length > 1) { int m = text.length /2; int n = text.length - m; String[] a1 = new String[m]; String[] a2 = new String[n]; System.arraycopy(text,0,a1,0,m); System.arraycopy(text,m,a2,0,n); a1 = sort(a1); a2 = sort(a2); text = marge(text,a1, a2); } return text; } private String[] marge(String[] text, String[] a1, String[] a2) { int i = 0; int j = 0; int k = 0; while (i < a1.length && j < a2.length ) { if (a1[i].compareTo(a2[j]) < 0 ) { text[k++] = a1[i++]; } else { text[k++] = a2[j++]; } } while (i < a1.length ) { text[k++] = a1[i++]; } while (j < a2.length ) { text[k++] = a2[j++]; } return text; } } /** * 挿入ソート */ class InsertionSorter extends Sorter { @Override public String[] sort(String[] text) { String line; for (int i=1; i<text.length; i++) { for (int j=0; j<i; j++) { if (text[i].compareTo(text[j]) < 0) { line = text[i]; for (int k=i; k>j; k--) { text[k] = text[k-1]; } text[j] = line; break; } } } return text; } } /** * バブルソート */ class BubbleSorter extends Sorter { @Override public String[] sort(String[] text) { String line; for (int i=0; i<text.length; i++) { for (int j=i; j<text.length; j++) { if (text[j].compareTo(text[i]) < 0) { line = text[i]; text[i] = text[j]; text[j] = line; } } } return text; } }
© 2006 矢木浩人