« Winny の技術 | トップページ | カブロボ・コンテスト »

2005.10.27

30 分で学んだ Ruby

この前は、Ruby で遊んでて、elsif を elseif と書いてることに気付かず、30分以上悩んだが。。。(ブログには書いてない)
今日は、30分ですんなり Comparable な Array が使えた(^^)v
Mixin はいまいち理解できてないけど。^^;

class CFoo
 include Comparable
 def initialize(n)
  @nBar = n
 end
 def GetBar()
  return @nBar
 end
 def <=>(obj)
  if @nBar < obj.GetBar() then
   return -1
  end
  if @nBar > obj.GetBar() then
   return 1
  end
  return 0
 end
end

foo1 = CFoo.new(123)
foo2 = CFoo.new(456)
foo3 = CFoo.new(78)

al = Array.new()
al << foo1
al << foo2
al << foo3

alSorted = al.sort()

alSorted.each do |ite|
 print ite.GetBar().to_s() + "\n"
end

こんな感じ。

なぜ Comparable な Array なのかというと、カブロボ・コンテスト(Java)がもうすぐ始まりそうなことに気付いたので。
前回は、適当に作って、750位だったので、今回はちょっと株を勉強して挑んでみようと思ったのだが、、、その前回の適当なプログラムで Comparable の Array を使ったことを思い出し、Ruby だと、どうやって書くのかな?と思ったので、ぐぐりまくったのだった。^^;

Java だと、

import java.util.*;

public class TestComparableArray {
 public static void main(String[] argv) {

  class CFoo implements Comparable {
   int nBar;
   public CFoo(int n) {
    nBar = n;
   }
   public int compareTo(Object obj) {
    if (nBar < ((CFoo) obj).nBar)
     return -1;
    if (nBar > ((CFoo) obj).nBar)
     return 1;
    return 0;
   };
  };

  CFoo foo1 = new CFoo(123);
  CFoo foo2 = new CFoo(456);
  CFoo foo3 = new CFoo(78);

  ArrayList al = new ArrayList();
  al.add(foo1);
  al.add(foo2);
  al.add(foo3);

  Collections.sort(al);

  for (int i = 0; i < al.size(); i++) {
   CFoo f = (CFoo) al.get(i);
   System.out.println(f.nBar);
  }
 }
}

こんな感じ。

その前の Terrairum コンテスト(JP:48位、US:10位以内、Canada:3位)(C#)でも、全て Comparable な Array は使っている。色々と便利なのだ。

C# だと、

using System;
using System.Collections;

public class TestComparableArray
{
 private class CFoo : IComparable {
  public int nBar = 0;
  public CFoo(int n) {
   nBar = n;
  }
  public virtual int CompareTo(object obj) {
   if (nBar < ((CFoo) obj).nBar)
    return -1;
   if (nBar > ((CFoo) obj).nBar)
    return 1;
   return 0;
  }
 };

 static void Main(string[] args) {

  CFoo foo1 = new CFoo(123);
  CFoo foo2 = new CFoo(456);
  CFoo foo3 = new CFoo(78);

  ArrayList al = new ArrayList();
  al.Add(foo1);
  al.Add(foo2);
  al.Add(foo3);

  al.Sort();

  foreach (CFoo i in al) {
   Console.WriteLine(i.nBar);
  }
 }
}

こんな感じ。


Java は、C++ の STL で sort(v.begin(), v.end()) するのと同様、 Collections.sort() するけど、C# と Ruby は、array を sort をするだけ(al.sort() するだけ)なんだよなぁ。直感的で好きだなぁ。Java と C++ は、data を function に渡して処理していくという昔のC言語的な古さを感じる気がする。まぁ、書き方を知らないだけなんだろうけどね。^^;


#Java では ArrayList は使っちゃだめ?thread safe じゃないんだっけ?
#Vector を使うべき?速い記憶があるから好きなのだが。。。
#ていうか、Java と C# のコード書くのに 30 分以上かかってたり。^^;


人気 blog ランキングへ(←フリーソフトを作るモチベーションアップのために、ぜひ。)

|

« Winny の技術 | トップページ | カブロボ・コンテスト »

「プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/20208/6649326

この記事へのトラックバック一覧です: 30 分で学んだ Ruby:

« Winny の技術 | トップページ | カブロボ・コンテスト »