2017-02-02 50 views

回答

1

sortedBy函數使用在其正文中表達的條件和每個收集結果之間的關係對元素進行排序。

在你的情況,假設你有一個surname屬性,下面的語句將使用<操作上的每個姓氏排序集合c聚集(等串的<):

c->sortedBy(p | p.surname) 

的想法可能計算一個唯一的字符串,使用姓氏和名字連接起來。因此,如果您有:

  • 喬治·史密斯
  • 加里·史密斯
  • 喬治Smath

比較會 「Smith_George」, 「Smith_Garry」 和 「Smath_George」 並會之間完成有序,繼字典順序,來:

  1. 喬治Smath(SM 一個噸h_George)
  2. 加里史密斯(Smith_G 一個 RRY)
  3. 喬治·史密斯(smith_G Ë薩維尼)

最後,OCL請求將是(假設surnamename作爲現有屬性):

c->sortedBy(p | p.surname + '_' + p.name) 

這個小技巧可以完成這項工作,但它並不完全是sortedBy的兩個參數比較。

+0

在我看來,這個解決方案將不會在所有情況下,我需要一件大事ersal。如果我們有例如兩個日期,這個解決方案將是錯誤的。例如,項目開始的日期和項目完成的日期。我可以在這種情況下使用什麼? – DM14

+0

正如我所說,這種解決方案在您的具體情況下使用名稱/姓氏是它會使用字典順序。我不確定,但我不認爲OCL sortedBy函數能夠執行這兩個條件搜索。在其他情況下,應該找到另一個技巧,在您的開始/結束日期示例中,您可以使用結束/開始日期計算每個項目花費的時間,並使用此標準對它們進行排序。否則,以yyy-mm-dd格式翻譯日期(帶有明顯的0顯式),帶字典順序的字符串技巧應該起作用。 –

0

OCL sortedBy(lambda)似乎與Java的排序(比較器)有很大不同,顯然需要投影對象作爲排序的度量。但是,如果投影是自己的,你有不同的Java功能。因此,如果您執行sortedBy(p | p),則排序取決於p的<操作。

爲了推動這項工作,未來OCL的Eclipse的OCL原型引入了OclComparable類型有compareTo方法使得能夠實現所有的關係操作提供您的自定義類型擴展OclComparable類型。

(A類似OclSummable零()和sum()操作支持收藏::總和()一般;如字符串實現和作爲串聯)

0

感謝您啓發了我。我剛剛提出了http://issues.omg.org/browse/OCL25-213其文本是:

sortedBy迭代爲排序問題提供了一個很好的解決方案,其中排序度量是排序對象的投影。因此sortedBy(p | p.name)或者sortedBy(name)很短,並且避免了涉及比較兩個對象的更傳統說明中的拼寫錯誤的機會。自然的解決方案對於具有非平凡指標的大集合來說可能是一個高效的解決方案。

然而,sortedBy解決方案並不熟悉,因此對於新手而言如此混亂,並且不適用於需要構建人造複合單鍵的多鍵分類。

一種解決方案是,提供一種更常規的迭代器例如排序(P1,P2 |比較表達)允許兩鍵排序:

排序(P1,P2 |讓DIFF1 = p1.key1.compareTo (p2.key1)in if diff1 <> 0 diff 1 else p1.key2.compareTo(p2.key2)endif)

但是這樣做的可讀性差,而且有很多錯別字的機會。

備選地sortedBy與元組值度量可能支持多個鍵爲:

sortedBy(元組{第一= KEY1,第二= KEY2})

(元組部分的名稱的字母順序確定優先級)。

(由於sortedBy是聲明明確而緊湊,效率低下的小/瑣碎的實現可以優化自己的sort()的等價物。)