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]
にしたらいいですね。
今日もガンガン単位を取得していきましょう。