我有以下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个小部件,其中包含以下相应的订单:{ 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(order = 1,order = 2等)到同一个内部Set
,然后按升序将这些集添加到外部List
。因此,如果我们要在上面的示例中添加第4个小部件:
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
}
有人能找到我出错的地方吗?
答案 0 :(得分:1)
我无法重现您的错误。由于equals
类中hashCode
和Widget
的实施方式,可能会发生这种情况。我设法使用@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]
]