この前は、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 ランキングへ(←フリーソフトを作るモチベーションアップのために、ぜひ。)
最近のコメント