2016/03/20(日) [n年前の日記]
#2 [prog] ProcessingでArrayListの動作テストをしていたのだけど
Processing上で配列を使う場合、最初から要素数を決めておかないといけないけれど。ArrayList を使えば、後から要素を増やしたり減らしたりすることができるらしいので、どんな書き方をすればいいのか試しているところ。
動作確認用のソースを書いてみたり。.add() .remove() .get() を使ってる。
_sketch_arraylist (Processing.js版)
_sketch_arraylist.pde (ソース)
ただ、いくつか分からない点が。
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の要素が増える)
- マウスの右ボタンを押しっぱなしで点が減る。(ArrayListの要素が減る)
ただ、いくつか分からない点が。
◎ ArrayListをソートする方法が分からない。 :
Processing で、ArrayList をソートする方法が分からない。
_Processing の公式ドキュメント
を見ると、「Javaのドキュメントを見ろや」としか書いてなくて。
一応、Java で ArrayList をソートする時は Collections.sort() が使える、とは分かったのだけど…。
_Question about sorting an arrayList of arrayLists - Processing 2.x and 3.x Forum で、使用例が紹介されてた。関係がありそうなところだけ抜き出してみると…。
比較用のメソッドは、例えば以下のような感じで用意するのだろう…。二つのオブジェクトを渡して何かしらを比較して、結果を -1, 0, +1 のどれかしらで返す、みたいな。
ところが、Java版ならコレで動くのだけど、JavaScript(Processing.js版)では動かない。「Collections なんてねえよ」と文句を言われる。まあ、Collections は、Java のソレだから…。
じゃあどうするのかとググってたら、「JavaScript の配列はそもそも push() とか使えるから、YOU、使っちゃいなよ」みたいなやり取りが。いやいやちょっと待て。それだと 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で書いてみた。
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順番が入れ替わってるよなあ…。予想通りに動いてる…。
[ ツッコむ ]
以上です。