[英]Grouping and sorting nested collections in Groovy
我有以下POGO:
class Widget {
String name
Integer order
// lots of other fields
Widget(Integer order) {
super()
this.order = order
}
}
我有一個List<Widget>
並嘗試將它們放入List<Set<Widget>>
,在其中將它們按order
字段分組。 因此,如果我有3個分別按以下順序List
的小部件: { 3, 1, 2 }
那么我將有一個大小為3的外部List
,並且該列表中的每個元素都是一個大小為1的Set
。我可以在代碼中手動生成通過:
Widget w1 = new Widget(3)
Widget w2 = new Widget(1)
Widget w3 = new Widget(2)
// Now sort them by order manually:
Set<Widget> firstOrderWidgets = []
firstOrderWidgets << w2 // order = 1
Set<Widget> secondOrderWidgets = []
secondOrderWidgets << w3 // order = 2
Set<Widget> thirdOrderWidgets = []
thirdOrderWidgets << w1 // order = 3
List<Set<Widget>> sortedCorrectly = []
sortedCorrectly << firstOrderWidgets // All widgets w/ order = 1
sortedCorrectly << secondOrderWidgets // All widgets w/ order = 2
sortedCorrectly << thirdOrderWidgets // All widgets w/ order = 3
因此,這里的想法是“未排序/未分組”的List<Widget>
可能會很大,並且許多小部件可能包含相同的順序。 我們希望將具有相同順序(order = 1,order = 2等)的所有小部件分組到相同的內部Set
,然后將這些集合按升序添加到外部List
中。 因此,如果我們要在上面的示例中添加第四個小部件:
Widget w4 = new Widget(2)
此小部件與另一個二階小部件一起屬於:
Set<Widget> secondOrderWidgets = []
secondOrderWidgets << w3 // order = 2
secondOrderWidgets << w4 // order = 2
因此,我試圖編寫一種方法,將List<Widget>
作為輸入,按order
它們進行分組,然后按升序對這些組/集進行排序。 保證order
字段為非空值,但可以是任何有效的正(1+)整數。 我的最佳嘗試是導致各種運行時/動態異常:
List<Set<Widget>> sortWidgets(List<Widget> toSort) {
def groupedByOrder = toSort.groupBy({ widget -> widget.order })
groupedByOrder = groupedByOrder.sort()
List<Set<Widget>> sortedList = []
groupedByOrder.each { order, widgets ->
sortedList << new HashSet(widgets)
}
sortedList
}
誰能發現我要去哪里?
我無法重現您的錯誤。 由於在Widget
類中如何實現equals
和hashCode
因此可能會發生這種情況。 我設法得到一個使用@Canonical
的工作示例:
@groovy.transform.Canonical
class Widget {
int order
String toString() { "Widget(order=$order, ${hashCode()})" }
}
widget = { new Widget(order: it) }
w1 = widget(3)
w2 = widget(1)
w3 = widget(2)
w4 = widget(2)
w5 = widget(2)
allWidgets = [w4, w1, w2, w5, w3]
def sortWidgets(widgets) {
widgets.sort(false) { it.order }.groupBy { it.order }.values() as List
}
assert sortWidgets(allWidgets) == [
[w2],
[w3, w4, w5],
[w1]
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.