アナグラムを生成するプログラム
千里の道も1歩から、
大規模なプログラムも最初から巨大であったわけではありません。
毎度、管理人イガジーです。
小さなものから徐々に積み上げて行って、大きくなるのですが
Javaは、そういう積み上げに向いている言語だと思います。
という訳で、昨日の総当り(順列)プログラムを元に
アナグラム(文字の並べ替え)アプリを作ってみましょう。
今回は、GUI にします。と言っても簡易ですが (^_^)
プログラム例は次のような感じです。
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Anagram implements ActionListener {
final int maxLen=6;
Frame f;
TextField tf;
Button gen;
TextArea ta;
int []as;
String ss=null;
Anagram() {
f=new Frame("Anagram");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
tf=new TextField(14);
tf.addActionListener(this);
gen=new Button("生成");
gen.addActionListener(this);
Panel p0=new Panel();
p0.setLayout(new FlowLayout());
p0.add(new Label("文字列:"));
p0.add(tf);
p0.add(gen);
f.add(p0,BorderLayout.NORTH);
ta=new TextArea(null, 40,40,TextArea.SCROLLBARS_VERTICAL_ONLY);
f.add(ta,BorderLayout.CENTER);
f.setSize(300,300);
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent ev) {
ss=tf.getText().trim();
int slen=ss.length();
if (slen>0) {
if (slen>maxLen) ta.setText("文字列が長すぎます¥n"
+maxLen+"文字以内でご利用ください");
else{
ta.setText(null);
as=new int[slen];
MyRoundRobin mr=new MyRoundRobin(as);
mr.solv();
}
}
}
public static void main(String[] args) {
new Anagram();
}
class MyRoundRobin extends RoundRR {
MyRoundRobin(int[] x) {
super(x);
}
@Override // RoundRRの表示メソッドを置き換える
public void dispa() {
ta.append(ans+": ");
for (int t:as) ta.append(ss.substring(t-1, t));
ta.append("¥n");
}
}
}
このコードは、昨日の RoundRR.java と同じ場所に置いてください。
class MyRoundRobin extends RoundRR {
と、クラスRoundRRをextends(継承)しています。
そこで表示用のメソッド dispa() を Override(置き換え)しています。
並べ替え処理自体は、RoundRR まかせで、何も書いていません。
MyRoundRobinに並べ替え処理を書かなくても、
MyRoundRobin mr=new MyRoundRobin(as);
mr.solv();
で、並べ替えることができるのです。
final int maxLen=6;
は、並べ替える文字列の最大文字数です。
この数値の6には深い意味はありませんが、7や8にすると結果の数が
膨大になるので6文字までにしています(プログラム自体は
10文字でも20文字でも動くはずです)。
このプログラムは、継承(extends)の威力を体験して頂くためのサンプルです。
chkv()も Override すると、ナンバープレースを解くこともできます。
作り的(インタフェース的)には、RoundRRは少し直した方がよいかな
と思う点もあるのですが、その話はまた後日。
この記事へのコメントはこちら