argius note

プログラミング関連

手動ソート

いくつかの候補を順位付けしたいんだけど、普通にやると上手くいかない。そこで、「AとBならどっち?」と言う風に聞かれたら答えやすいかな、と考え付いたのがこれ。
正確には比較を手動で行うので「手動比較ソート」となるのでしょうか。
PerlRubyJavaで作ってみました。基本的には同じですが、ソートアルゴリズムによって質問の順番は変わります。

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位:紫