我需要通過兩個參數來排序人員的集合,通過姓氏和名稱之後。我如何在OCL中做這樣的事情?如何在OCL中分揀兩個參數?
回答
sortedBy
函數使用在其正文中表達的條件和每個收集結果之間的關係對元素進行排序。
在你的情況,假設你有一個surname
屬性,下面的語句將使用<
操作上的每個姓氏排序集合c
聚集(等串的<
):
c->sortedBy(p | p.surname)
的想法可能計算一個唯一的字符串,使用姓氏和名字連接起來。因此,如果您有:
- 喬治·史密斯
- 加里·史密斯
- 喬治Smath
比較會 「Smith_George」, 「Smith_Garry」 和 「Smath_George」 並會之間完成有序,繼字典順序,來:
- 喬治Smath(SM 一個噸h_George)
- 加里史密斯(Smith_G 一個 RRY)
- 喬治·史密斯(smith_G Ë薩維尼)
最後,OCL請求將是(假設surname
和name
作爲現有屬性):
c->sortedBy(p | p.surname + '_' + p.name)
這個小技巧可以完成這項工作,但它並不完全是sortedBy的兩個參數比較。
OCL sortedBy(lambda)似乎與Java的排序(比較器)有很大不同,顯然需要投影對象作爲排序的度量。但是,如果投影是自己的,你有不同的Java功能。因此,如果您執行sortedBy(p | p),則排序取決於p的<操作。
爲了推動這項工作,未來OCL的Eclipse的OCL原型引入了OclComparable類型有compareTo方法使得能夠實現所有的關係操作提供您的自定義類型擴展OclComparable類型。
(A類似OclSummable零()和sum()操作支持收藏::總和()一般;如字符串實現和作爲串聯)
感謝您啓發了我。我剛剛提出了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()的等價物。)
- 1. 集合中的兩個參數基礎分揀同時
- 2. 在Python中分揀數據
- 3. 分層由OCL
- 4. OCL驗證參數中的值
- 5. IPRange分揀機在Java中
- 6. 每天分揀總數,由
- 7. 提高分揀
- 8. 分揀線
- 9. 分揀的UITableView
- 10. MySQL的 - 分揀
- 11. 如何在opencv中使用ocl模塊
- 12. 如何用TCL中的exec在兩個參數中分割一個變量?
- 13. 在ExtJS中,我如何知道商店何時開始分揀並完成分揀?
- 14. 僅gridview ASC正在分揀
- 15. 如何進行分揀工作?
- 16. 如何禁用jtable行分揀機
- 17. 檢查OCL部分AST
- 18. Lexographically分揀用java
- 19. 結果分揀表
- 20. 在MATLAB中實現分揀機
- 21. 如何在網格視圖中反映商店的分揀機?
- 22. 鏈接列表:如何在C中進行分揀機檢查?
- 23. 如何在reduxframework中定義分揀機標籤寬度?
- 24. 如何編寫OCL約束
- 25. OCL asSet如何工作?
- 26. 遞歸在OCL
- 27. 在OCL中定義數據類型
- 28. 如何傳遞兩個數組參數
- 29. 在做分揀時應該在哪個分支?
- 30. 如何在Python中調用帶有兩個參數的函數
在我看來,這個解決方案將不會在所有情況下,我需要一件大事ersal。如果我們有例如兩個日期,這個解決方案將是錯誤的。例如,項目開始的日期和項目完成的日期。我可以在這種情況下使用什麼? – DM14
正如我所說,這種解決方案在您的具體情況下使用名稱/姓氏是它會使用字典順序。我不確定,但我不認爲OCL sortedBy函數能夠執行這兩個條件搜索。在其他情況下,應該找到另一個技巧,在您的開始/結束日期示例中,您可以使用結束/開始日期計算每個項目花費的時間,並使用此標準對它們進行排序。否則,以yyy-mm-dd格式翻譯日期(帶有明顯的0顯式),帶字典順序的字符串技巧應該起作用。 –