変数 オブジェクトの配列は・・


オブジェクトを含むの配列はソート出来ない
むー
まぁ、ふつうに考えれば、ソートしようにも
何でソートするかが判定できないのだな

比較可能な情報が特定できない、もしくはないので比較できない

それじゃ、たとえば、配列に入れたオブジェクトを
名前順に入れ替えるにはどうすればいいのだろう

実直に、名前を回収して
ソートをすればいいのかもしれないが

Maxはオブジェクト名を重複して持つことが出来る
なぜ出来るかといえば、Maxはオブジェクトの管理にinodeを使っているからだ
つまりは管理番号があるのサ

ちなみに、オブジェクト名で選択する記事
http://www.sakaiden.com/?p=1612

その番号を知るには $.inode.handle  といった感じで

ってことは、名前だけ回収して、配列に入れ直すと
重複していた場合に誤作動となるわけだな

では、どうやってソートするか

ここで登場するのが
stricmp と qsort

stricmp は文字列の並びの大小を比較し
qsort は配列のソートルールを任意に決められるモノだぞ

stricmpについては、たとえば
stricmp “a” “b”
とした場合、bはaよりも文字は後にくるモノだから、これを数値に置き直し
-1というリザルトが出てくる
最初の文字を0として、どれくらい前または後に出てくる文字なのかを
数字で教えてくれるのサ、stricmp “a” “c”ならば-2だぞ

ちなみに、文字列の比較しても頭文字でしか判断はしてくれないので注意
一応、日本語名の比較もいけるみたいだぞ

ではでは、オブジェクト名でソートするやつをどうぞ

[as3]
selObj = selection as Array;
print selObj;

fn nameStringSort_Fn s1 s2 =
(
 –名前の文字列を比較した結果を代入
 local a = (stricmp s1.name s2.name);

–比較結果から仕分けを行う
 case of
  (
  (a < 0.): -1
  (a > 0.): 1
  default: 0
  );–case end
);–fn end

–任意のルール(nameStringSort_Fn)で名前順にソートする
qsort selObj nameStringSort_Fn
print selObj

/*以下は実行結果のリザルト

ソート前

$Box:Box04 @ [58.229515,68.666962,0.000000]
$Cylinder:Cylinder01 @ [228.840652,-183.777267,0.000000]
$GeoSphere:GeoSphere01 @ [-34.308987,-0.816744,0.000000]
$Tube:Tube01 @ [-144.798553,14.125756,0.000000]
$Teapot:Teapot02 @ [79.235031,-106.924255,0.000000]
$平面:Plane01 @ [40.678776,-134.332596,0.000000]
$Pyramid:Pyramid01 @ [25.698250,-65.091812,0.005000]
$Box:Box01 @ [-51.889168,-33.249371,0.000000]
$Box:Box02 @ [145.889282,-85.260338,0.000000]
$Box:Box03 @ [55.511215,-16.000343,0.000000]
$Sphere:Sphere01 @ [82.172897,-162.063416,0.000000]
$Torus:Torus01 @ [105.171730,-95.666649,0.000000]
$Cone:Cone01 @ [234.447601,-149.137039,0.000000]
$Torus:Torus02 @ [-165.573486,124.228073,0.000000]
$Teapot:Teapot01 @ [154.617615,-183.855530,0.000000]

ソート後

$Box:Box01 @ [-51.889168,-33.249371,0.000000]
$Box:Box02 @ [145.889282,-85.260338,0.000000]
$Box:Box03 @ [55.511215,-16.000343,0.000000]
$Box:Box04 @ [58.229515,68.666962,0.000000]
$Cone:Cone01 @ [234.447601,-149.137039,0.000000]
$Cylinder:Cylinder01 @ [228.840652,-183.777267,0.000000]
$GeoSphere:GeoSphere01 @ [-34.308987,-0.816744,0.000000]
$平面:Plane01 @ [40.678776,-134.332596,0.000000]
$Pyramid:Pyramid01 @ [25.698250,-65.091812,0.005000]
$Sphere:Sphere01 @ [82.172897,-162.063416,0.000000]
$Teapot:Teapot01 @ [154.617615,-183.855530,0.000000]
$Teapot:Teapot02 @ [79.235031,-106.924255,0.000000]
$Torus:Torus01 @ [105.171730,-95.666649,0.000000]
$Torus:Torus02 @ [-165.573486,124.228073,0.000000]
$Tube:Tube01 @ [-144.798553,14.125756,0.000000]
*/
[/as3]

こんなところだ
実行後はちゃんと名前順に並んでいるぞ
途中の平面は、元々名前がPlaneなので、そっちで比較されているのだ

よし、また一つ勉強になった

一応、アップしておこう


ダウンロード:名前で比較するアレ

Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください