kanizaのブログ

コンピュータ、ソフトウェア、映画、音楽関連や家族のことなど、思いついたことを書きます。

手動リスト

java.util.AbstractList は、いくつかのメソッドをオーバーライドすると簡単に独自の List 実装を作れる。お遊びで「手動リスト」を作ってみた。データはユーザーが紙か何かの上で管理して、求められたらダイアログで入力する。

下のコードがクラス。実行用のmainメソッドでは、このリストをソートしている。

紙でもなんでもいいから、どこかにいくつか箱を書いて、0から順に番号を振る。そうしたら、それぞれの箱の中に適当に数字を入れる。これが元のリストのデータとなる。

プログラムを走らせて、指示に従って数字を答えたり手元の数字を入れ替えたりしていくと、いつの間にか手元のデータが昇順に並ぶ。これは便利.............じゃないですね。

HandList Input Dialog

package manual;

import java.util.AbstractList;
import java.util.Collections;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class ManualList extends AbstractList<Integer> {

    private int size = -1;

    @Override
    public Integer set(int index, Integer element) {
        return askInt(String.format("%d 番目を %s にしてください。変更前の %d 番目は何でしたか?",
                index, element, index));
    }

    @Override
    public Integer get(int index) {
        return askInt(String.format("%d 番目は何ですか?", index));
    }

    @Override
    public int size() {
        if (size < 0) {
            // サイズは変更しないことが前提だし何度も聞かれるとうるさいので
            // いったん聞いたら保存している。
            size = askInt("要素の数はいくつですか?");
        }
        return size;
    }

    private Integer askInt(String message) {
        String result = JOptionPane.showInputDialog(message);
        if (result == null) System.exit(0);
        try {
            return Integer.valueOf(result);
        } catch (NumberFormatException ex) {
            return askInt(message);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ManualList list = new ManualList();
                Collections.sort(list);
            }
        });
    }
}