半空洞男女関係

思ったこととかプログラミングしてるときのメモとか色々かいてます。メールはidそのままgmail

Processingでサポートされていない配列を雑にソートする

1次元の配列に対してのソートはProcessingで用意されていて、Arrayに対してsort()をかけるといい感じになる。

sort() \ Language (API) \ Processing 2+

reverse()もあるから、逆順にソートしたければ、簡単にできる。

でも2次元の配列に対してソートをかけたいときはどうでしょう。ある次元にいくつかデータの固まりがあり、もう1つの次元で整列されている。それぞれ、0番目の値を使ってソートして欲しい。

具体的にはこんな感じのデータです。

int[][] points = {{ 0, 3, 4 }, // point, x, y
                  { 5, -1, 4 },
                  { 2, 3, -4 }};

ProcessingはJavaという言語の中に居ます。つまりいざというときはJavaの機能を引き出して利用できる。そこでJavaのComparatorという機能を使います。「あるモノが2つ渡された時に、大きいのか小さいのかを比べた結果」を返す関数を書けば、勝手にソートしてくれる。具体例は以下です。

// 使いたい機能をimportする
import java.util.Arrays; 
import java.util.Comparator; 

// ソートする
Arrays.sort(points, new Comparator() {
  public int compare(Object o0, Object o1) {
    int[] a0 = (int[]) o0;
    int[] a1 = (int[]) o1;
    return a0[0]-a1[0];
  }
});

Comparatorクラスのcompareをオーバーロードします。返す値はtrue/falseではなくて整数(int)なのに注意してください。

これでソート出来るようになりました。逆順にしたければa0[0]-a1[0]の部分をa1[0]-a0[0]にしたらいいですね。

今日もガンガン単位を取得していきましょう。