複数コレクションの同期ソート

4D には、オブジェクトのコレクションを扱うための強力な機能があります。

たとえば、都市とそれに関連する国や大陸のコレクションを作成することができます。このようなコレクションを、.sort()、.order()、.filter() のようなビルトイン関数で操作するのは簡単です。

4D v20 R3 では、並べ替え処理を簡素化するために、新しい multiSort() 関数が導入されました。この関数を使うことで、複数コレクションの同期ソートが可能です

新しい関数

この新しい multiSort() 関数を使用すると、複数のコレクションに対して複数レベルの同期ソートを実行できます。

この関数を引数なしで呼び出すと、.sort() 関数と同じ結果が得られます。デフォルトでは、コレクションは型に従って昇順にソートされます (スカラー値のみ)。

昇順以外の順序でコレクションをソートしたい場合は、フォーミュラを指定する必要があります:

$col.multiSort( [ $col2 ; $col3 ] )
$col.multiSort( $formula; [$col2 ; $col3] )

複数レベルの同期ソートを定義することも可能です。これは SORT MULTIPLE ARRAY コマンドに似ています。

この場合には、collection属性と order属性を含むオブジェクトを渡します。

$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col.multiSort( $formula; [ {collection: $col2; order: ck ascending} ; $col3 ] )

この関数は、安定性のあるソートアルゴリズムを使用します。つまり、同じ値を持つ 2つの要素は、入力データと同じ順序で、ソート後の出力データに現れます。

HDI: 複数コレクションの同期ソート

都市 (city)、国 (country)、大陸 (continent) の例に戻りましょう:

var $city : Collection
var $country : Collection
var $continent : Collection

$city:=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country:=["France"; "France"; "Morocco"; "Germany"; "US"]
$continent:=["Europe"; "Europe"; "Africa"; "Europe"; "America"]

例1: 最初のコレクション ($continent) の単純なソートと、他のコレクション ($country$city) の同期ソート:

$continent.multiSort([$country; $city])

結果は次のようになります:

"Africa"; "America"; "Europe"; "Europe"; "Europe" 
"Morocco"; "US"; "France"; "France"; "Germany" 
"Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"

例2: 1番目と3番目のコレクション ($continent$city) の昇順ソートと、2番目のコレクション ($country) の同期ソート:

$continent.multiSort([$country; {collection: $city; order: ck ascending}])

結果は次のようになります:

"Africa"; "America"; "Europe"; "Europe"; "Europe"
"Morocco"; "US"; "France"; "France"; "Germany"
"Rabat"; "San Diego"; "Lyon"; "Paris"; "Eching"

例3: 最初のコレクション ($continent) のフォーミュラによるソートと、他のコレクション ($country$city) の同期ソート

この例のフォーミュラは簡単で、降順にソートします。しかし、ニーズに合わせて、もっと複雑なフォーミュラも使用できます。

$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])

結果は次のようになります:

"Europe"; "Europe"; "Europe"; "America"; "Africa"
"France"; "France"; "Germany"; "US"; "Morocco"
"Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"

例4: 複雑なコレクション

オブジェクトのコレクションを同期させるために使うこともできます:


var $name : Collection
var $address : Collection
$name:=[]
$name.push({firstname: "John"; lastname: "Smith"})
$name.push({firstname: "Alain"; lastname: "Martin"})
$name.push({firstname: "Jane"; lastname: "Doe"})
$name.push({firstname: "John"; lastname: "Doe"})
$address:=[]
$address.push({city: "Paris"; country: "France"})
$address.push({city: "Lyon"; country: "France"})
$address.push({city: "Eching"; country: "Germany"})
$address.push({city: "Berlin"; country: "Germany"})

$name.multiSort(Formula($1.value.firstname<$1.value2.firstname); [$address])

結果は次のようになります:

"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe"
"Lyon France"; "Eching Germany"; "Paris France"; "Berlin Germany" 

次は…

詳細については、ドキュメントを参照ください。フォーラムでフィードバックや使用例を共有することができます。

Vanessa Talbot
- プロダクトオーナー - Vanessa Talbotは、2014年6月に4Dプログラムチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。入社以来、4Dにおける主要機能の定義に関わってきました。プリエンプティブ/マルチスレッドの新機能の大部分と、非常に複雑なテーマである組み込みアプリケーションの新アーキテクチャに取り組んできました。VanessaはTelecom Saint-Etienneで学位を取得後、Criminal Research Institute でオーディオビジュアル部門の開発者としてキャリアをスタートさせました。また、メディアや医療の分野でも、技術サポートやプロダクションの分野で働いてきました。