enum例

enumキーワードで作る特殊なクラスです。
enumはenumerate(イニュームレイトあるいはイヌームレイト)の略で、列挙するの意味です。
一連の値を定義する文法でC言語の列挙型に似ているが、C言語と違って実態は JDK1.5で導入された、Enumというクラスを継承している。
また、列挙子自体は、static finalな定数(不変オブジェクト)として定義されている。
!= や == は使えますが、Cと違って、< > などの比較演算はできない。 
また、この変数に対して、++もできない。
比較をする場合は、列挙子.compareTo(列挙子) で比較する。
intへのキャストもできない。順位番号は、ordinal()メソッドを利用する。
なお、toString()がオーバーライドされているので、表示することが可能


以下では『SortMethod』のクラスを作っています。 この変数に記憶できるのは、{ }の中で列挙したデータを SortMethod.マージ, SortMethod.バブル, SortMethod.クイックのSortMethodを指定したいずれかだけになります。
なお、 switch文で使用する場合、case文の定数にenum型名の修飾子は省略できます。
各クラスの詳細は次のリンクで調べましょう。


package test;
import java.util.*;//Randomなどのパッケージ用
import java.awt.*;//BorderLayoutなどのパッケージ用
import java.awt.event.*;//MouseListenerなどのパッケージ用
import javax.swing.*;//JPanelなどのパッケージ用

enum SortMethod { マージ, バブル, クイック,  };//コンボボックス項目用の列挙型

public class SortTestMulti extends JApplet
{//アプレット時
	MainPanel panel;
	public void init()
	{//ダウンロード直後で実行(コンストラクタの後)
		this.getContentPane().add(panel = new MainPanel());
	}
	public static void main(String[] args)//----------------メイン---------
	{//ローカル起動時
		TestFrame f = new TestFrame();
	}
	public void newTestFrame()
	{
		new TestFrame();
	}
}
//--------------------------------------------------------------------------
class TestFrame extends JFrame
{
	MainPanel panel = new MainPanel();
	public TestFrame()
	{//コンストラクタ
		this.setTitle("並び替え");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.getContentPane().add(panel, BorderLayout.CENTER);
		this.setSize(600, 480);
		this.setVisible(true);
	}
}
//--------------------------------------------------------------------------
class MainPanel extends JPanel implements ActionListener
{
	SortMethod sortMethod = SortMethod.values()[0];//初期ソート方法

	JButton btnRandom = new JButton("乱数生成");
	JComboBox comboBox = new JComboBox();
	JButton btnSort = new JButton("ソート開始");
	static JEditorPane editorPane = new JEditorPane();

	int[] a = { 2, 4, 1, 3, 2, 7, 8 };//中間テストでの並び
	Random rnd = new Random(54321);
	int [] array = a;
	
	public MainPanel()
	{
		this.setLayout(new BorderLayout());
		JPanel panel = new JPanel();
		panel.add(btnRandom);//乱数生成ボタン配置
		panel.add(comboBox);//乱数生成ボタン配置	
		panel.add(btnSort);//ソートボタン配置
		this.add(panel, BorderLayout.NORTH);

		this.editorPane.setFont(new Font("monospaced", Font.PLAIN, 14)); //フォント設定
		this.editorPane.setBackground(new Color(255, 255, 255));
		this.editorPane.setForeground(new Color(0,0,0));
		this.add(new JScrollPane(editorPane), BorderLayout.CENTER);
		for( SortMethod en : SortMethod.values() ){//全ての列挙で項目を生成
			this.comboBox.addItem(en);
		}
			
		this.btnRandom.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String rtnVal = javax.swing.JOptionPane.showInputDialog(MainPanel.this,
					"生成個数を入力ください","10"
				);
				if (rtnVal == null) return;
				java.util.regex.Pattern pattern;
				pattern = java.util.regex.Pattern.compile("[1-9]?[0-9]*");
				java.util.regex.Matcher matcher = pattern.matcher(rtnVal);//上記正規表現とマッチするか?
				if(matcher.matches()){
					int n = Integer.parseInt(rtnVal);
					setRandom(n);// n個の乱数生成
					editorPane.setText("");
					printArray(MainPanel.this.array);//全てを1行列挙
				}
				else
				{
					JOptionPane.showMessageDialog(MainPanel.this,"数字を入力ください",
					"エラー", JOptionPane.ERROR_MESSAGE);
				}
			}
		});

		this.comboBox.addItemListener( new ItemListener(){
			//ユーザにる項目の選択・解除で実行する
			public void itemStateChanged(ItemEvent e)
			{
				JComboBox cBox = (JComboBox)e.getSource();	//イベント発生オブジェクト取得
				int idx = cBox.getSelectedIndex();//指定された項目の添え字
				MainPanel.this.sortMethod = (SortMethod)cBox.getItemAt(idx);
				//System.out.println(MainPanel.this.sortMethod);
			}
		});

		MainPanel.printArray(this.array);//全てを1行列挙
		this.btnSort.addActionListener(this);
	}

	void setRandom(int n){//--------乱数を n個生成
		array = new int[n];
		for (int i = 0; i < n; i++){
			array[i] = rnd.nextInt(1000);
		}
	}


	static void printArray(int[] array, int left, int right, int width)
	{// ----配列 array の指定範囲を、列挙 なお、1要素は右よせ幅指定で行う
		for (int i = left; i <= right; i++)
		{
			String s = String.format("%" + width + "d" , array[i]);
			editorPane.replaceSelection(s);
		}
	}

	static void lastSelect(){//末尾を選択
		javax.swing.text.Document document = editorPane.getDocument();
		int len = document.getLength();
		editorPane.setSelectionStart(len);//末尾を選択
	}
	
	static void printArray(int[] array)
	{// -----デフォルト幅指定で、全てのarray配列を、末尾に列挙後に改行する。
		lastSelect();//末尾を選択
		printArray( array, 0, array.length- 1 , 5);
		editorPane.replaceSelection("\n");
	}
	

	public void actionPerformed(ActionEvent e)//-------------ソート実行
		lastSelect();//末尾を選択
		editorPane.replaceSelection("\n");	
		switch(this.sortMethod){

			case バブル:
				Bubble.bubbleSort(this.array, this.array.length);
				break;
			
			case クイック:
				Quick.quick_sort(this.array);
				break;

			case マージ:
				Merge.merge_sort(this.array);
				break;

		}
		editorPane.replaceSelection("以上で終了\n");
		printArray(this.array);
	}

 
	static void println(int[] array)
	{// ----標準出力で確認-------------
		for (int i = 0; i <array.length; i++)
		{
			String s = String.format("%" + 5 + "d", array[i]);
			System.out.print(s);
		}
		System.out.println();
	}


	//--------バブルソート クラス-----------------------------
	static class Bubble {
		static void swap(int[] a, int i1, int i2)
		{
			int t = a[i1];
			a[i1] = a[i2];
			a[i2] = t;
		}

		static void bubbleSort(int[] a, int N)//バブルソート改良版
		{
			int idx = 0;
			for (int i = 0; i < N - 1; /*i++*/)
			{
				int exchg = 0;
				int k = 0;
				for (k = N - 2; k >= i; k--)
				{
					if (a[k] > a[k + 1])
					{
						swap(a, k, k + 1);
						exchg = 1;
						idx = k;
					}
				}
				if (exchg == 0) break;
				if (idx == k) i++;
				else i = idx;
				printArray(a); println(a);//経過表示-----
			}
		}
	}

	//--------クイックソート クラス-----------------------------
	static class Quick {
		static void _swap(int[] array, int i1, int i2) throws  Exception
		{
			int temp = array[i1];
			array[i1] = array[i2];
			array[i2] = temp;
			Thread.sleep(1);
		}

		static void _quick_sort(int[] array, int left, int right)throws  Exception
		{
			int l = left;
			int r = right;
			int x = array[ (l + r) /2 ];
			do {
				while (array[l] < x) l++;
				while (array[r] > x) r--;
				if (l <= r) _swap(array,l++, r--);
			} while (l <= r);
			if (left < r) _quick_sort(array,left, r);
			if (l < right) _quick_sort(array,l, right);
			printArray(array); println(array);//経過表示-----
		}

		static void quick_sort(int[] array)
		{
			try {
				_quick_sort(array, 0, array.length - 1);
			}
			catch (Exception e){
				System.out.println(e.toString());
			}
		}
	}
	
	//--------マージソート クラス-----------------------------
	static class Merge
	{
		static int []buff;
		static void _merge_sort(int []a, int left , int right){
			if(left < right){
				int center = (left + right)/2;
				_merge_sort(a, left, center);
				_merge_sort(a, center+1, right);
				int i;
				for(i=left; i <= center; i++){//buffheへコピー
					buff[i] = a[i];
				}
				//マージ
				int k = left;
				int j = left;
				while(j <= center && i <= right){
					if(buff[j] <= a[i]) a[k++] = buff[j++];
					else a[k++] = a[i++];
				}

				//残りをコピー
				if(j <= center) while(j <= center) a[k++] = buff[j++];
				else while (i <= right) a[k++] = a[i++];
				printArray(a); println(a);//経過表示-----
			}
		}
		
		static void merge_sort(int []array){
			buff = new int [array.length];
			_merge_sort(array, 0, array.length -1);
		}
	}
	
}