手動ソート
いくつかの候補を順位付けしたいんだけど、普通にやると上手くいかない。そこで、「AとBならどっち?」と言う風に聞かれたら答えやすいかな、と考え付いたのがこれ。
正確には比較を手動で行うので「手動比較ソート」となるのでしょうか。
PerlとRubyとJavaで作ってみました。基本的には同じですが、ソートアルゴリズムによって質問の順番は変わります。
Perl(5.8)版
use strict; sub compare_manually { printf "[%s] より [%s] のほうが好き? (y/N) > ", @_; chomp(my $input = <STDIN>); my $result = ($input eq "y") ? 1 : -1; print ($result == 1 ? "はい" : "いいえ", "\n\n"); return $result; } my @items = qw( 赤 紫 黒 緑 青 白 黄 ); my @sorted = sort { compare_manually($a, $b) } @items; for (my $i = 0; $i < @sorted; $i++) { printf "%d位:%s\n", ($i + 1), $sorted[$i]; }
Ruby(1.8)版
compare_manually = lambda do |a,b| print "#{a} より #{b} のほうが好き? (y/N) > " result = (gets.chomp == "y" ? 1 : -1); if result == 1 then puts "はい" else puts "いいえ" end puts result end items = %w( 赤 紫 黒 緑 青 白 黄 ) items.sort(&compare_manually).each_with_index do |item,index| puts "#{index + 1}位:#{item}" end
Java(5.0)版 ※Scanner使うように修正
import java.io.*; import java.util.*; public final class ManualSortComparator implements Comparator<String> { public int compare(String s1, String s2) { System.out.print("[" + s1 + "] より [" + s2 + "] のほうが好き? (y/N) > "); Scanner input = new Scanner(System.in); int result = (input.next().equals("y")) ? 1 : -1; System.out.println((result == 1) ? "はい" : "いいえ"); System.out.println(); return result; } public static void main(String[] args) { String[] items = {"赤", "紫", "黒", "緑", "青", "白", "黄",}; Arrays.sort(items, new ManualSortComparator()); for (int i = 0; i < items.length; i++) { System.out.println((i + 1) + "位:" + items[i]); } } }
実行結果(Ruby版)
赤 より 緑 のほうが好き? (y/N) > y はい 緑 より 黄 のほうが好き? (y/N) > y はい 紫 より 緑 のほうが好き? (y/N) > y はい 白 より 緑 のほうが好き? (y/N) > y はい 青 より 緑 のほうが好き? (y/N) > n いいえ 黒 より 緑 のほうが好き? (y/N) > n いいえ 紫 より 白 のほうが好き? (y/N) > y はい 白 より 赤 のほうが好き? (y/N) > n いいえ 紫 より 赤 のほうが好き? (y/N) > y はい 黄 より 青 のほうが好き? (y/N) > y はい 青 より 黒 のほうが好き? (y/N) > n いいえ 黄 より 黒 のほうが好き? (y/N) > y はい 1位:青 2位:黒 3位:黄 4位:緑 5位:白 6位:赤 7位:紫