java.util.AbstractList は、いくつかのメソッドをオーバーライドすると簡単に独自の List 実装を作れる。お遊びで「手動リスト」を作ってみた。データはユーザーが紙か何かの上で管理して、求められたらダイアログで入力する。
下のコードがクラス。実行用のmainメソッドでは、このリストをソートしている。
紙でもなんでもいいから、どこかにいくつか箱を書いて、0から順に番号を振る。そうしたら、それぞれの箱の中に適当に数字を入れる。これが元のリストのデータとなる。
プログラムを走らせて、指示に従って数字を答えたり手元の数字を入れ替えたりしていくと、いつの間にか手元のデータが昇順に並ぶ。これは便利.............じゃないですね。
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); } }); } }