【发布时间】:2016-07-28 04:34:30
【问题描述】:
我有以下 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 = 1, order = 2, etc.) 到相同的内部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
}
谁能看出我哪里出错了?
【问题讨论】:
标签: sorting groovy collections