mieki256's diary



2016/03/20() [n年前の日記]

#2 [prog] ProcessingでArrayListの動作テストをしていたのだけど

Processing上で配列を使う場合、最初から要素数を決めておかないといけないけれど。ArrayList を使えば、後から要素を増やしたり減らしたりすることができるらしいので、どんな書き方をすればいいのか試しているところ。
ArrayList lst = new ArrayList();

lst.add(new Hoge()); // 要素の追加
lst.add(new Hoge());
lst.add(new Hoge());

Hoge fuga = (Hoge)lst.get(0); // 要素の取得

lst.remove(0); // 要素の削除。インデックス値を与えて削除する。

動作確認用のソースを書いてみたり。.add() .remove() .get() を使ってる。

_sketch_arraylist (Processing.js版)
_sketch_arraylist.pde (ソース)
ただ、いくつか分からない点が。

ArrayListをソートする方法が分からない。 :

Processing で、ArrayList をソートする方法が分からない。 _Processing の公式ドキュメント を見ると、「Javaのドキュメントを見ろや」としか書いてなくて。

一応、Java で ArrayList をソートする時は Collections.sort() が使える、とは分かったのだけど…。

_Question about sorting an arrayList of arrayLists - Processing 2.x and 3.x Forum で、使用例が紹介されてた。関係がありそうなところだけ抜き出してみると…。
import java.util.Collections;
import java.util.Comparator;
 
final ArrayList<float[]> bigList = new ArrayList();
 
final Comparator<float[]> compBy2nd = new Comparator<float[]>() {
  int compare(float[] f1, float[] f2) {
    return (int) Math.signum(f2[1] - f1[1]);
  }
};

// 中略

  Collections.sort(bigList, compBy2nd);
  • 最初のあたりで、java.util.Collections と java.util.Comparator を import しておく。
  • ソート時に使う比較用メソッドを用意しておく。(上記の例の場合、compBy2nd がソレ)
  • Collections.sort(ArrayListのソレ, 比較用メソッド); で呼ぶとソートできる。

比較用のメソッドは、例えば以下のような感じで用意するのだろう…。二つのオブジェクトを渡して何かしらを比較して、結果を -1, 0, +1 のどれかしらで返す、みたいな。
// ソート時に使うメソッド
// PVector の x でソートする
final Comparator<PVector> compPVec = new Comparator<PVector>() {
  int compare(PVector a, PVector b) {
    if (a.x > b.x) return 1;
    if (a.x == b.x) return 0;
    return -1;
  }
};

ところが、Java版ならコレで動くのだけど、JavaScript(Processing.js版)では動かない。「Collections なんてねえよ」と文句を言われる。まあ、Collections は、Java のソレだから…。

じゃあどうするのかとググってたら、「JavaScript の配列はそもそも push() とか使えるから、YOU、使っちゃいなよ」みたいなやり取りが。いやいやちょっと待て。それだと Processing のJava版で動かなくなるだろ…。

さて、どうすればいいのだろう…。

Collectiions.shuffle() が動かない気がする。 :

Processing 上では、要素の並びをシャッフルしてくれる、Collections.shuffle() が動かない気がする。気のせいだろうか。手元の Processing 3.0.2 では動いてるように見えないのだけど。

Javaの動作をそのまま引き継いでくれるわけではないのかな。どうなってるんだろう。そもそも、Java ではどのように動くのだろう。Javaソースを書いて確認してみるしかないのかな…。

Javaで書いてみた。
// Collections.shuffle() の動作確認

import java.util.ArrayList;
import java.util.Collections;

class arraylistshuffle {
    public static void main(String[] args) {
        ArrayList<Integer> lst = new ArrayList<Integer>();

        for(int i=0; i<10; i++) {
            lst.add(i);
        }

        dumpList(lst);

        Collections.shuffle(lst);
        dumpList(lst);
    }

    private static void dumpList(ArrayList<Integer> lst) {
        for(int i=0; i<lst.size(); i++) {
            System.out.print(String.valueOf(lst.get(i)) + " ");
        }
        System.out.println(" ");
    }
}
> javac arraylistshuffle.java
> java arraylistshuffle
0 1 2 3 4 5 6 7 8 9
9 4 0 7 2 1 5 8 3 6
順番が入れ替わってるよなあ…。予想通りに動いてる…。

以上です。

過去ログ表示

Prev - 2016/03 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project