アナグラムを生成するプログラム

 

千里の道も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は少し直した方がよいかな
と思う点もあるのですが、その話はまた後日。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)