Grails - 按元素和数组排序集合

时间:2012-11-19 20:21:01

标签: arrays sorting grails collections

是否有“groovy”方式通过第一个参数对集合进行排序,如果第一个参数在两个或多个元素中重复,则按第二个参数排序(第二个参数是数组)?

示例:

已编辑(子数组的长度可变):

[1,[1,2,3]]
[1,[4,6]]
[2,[1,2,3,4,5]]
[3,[1,2,3]]
[3,[1,2,4,5]]

提前致谢

2 个答案:

答案 0 :(得分:0)

请查看gist的以下tim yates

它显示了如何使用多个比较器对列表进行排序的方法。

对于你的例子:

Collection.metaClass.sort = { boolean mutate, Closure... closures ->
    delegate.sort( mutate ) { a, b ->
        closures.findResult { c -> c( a ) <=> c( b ) ?: null }
    }
} 

def list = [[3, [1,2,3]],
                [1, [4,5,6]],
                [2, [1,2,3]],
                [1, [1,2,3]],
                [3, [1,2,4]]]

assert list.sort(false, {it[0]}, {it[1][0]}, {it[1][1]}, {it[1][2]}) == [[1, [1,2,3]],
                                                                         [1, [4,5,6]],
                                                                         [2, [1,2,3]],
                                                                         [3, [1,2,3]],
                                                                         [3, [1,2,4]]] 

希望有帮助...

答案 1 :(得分:0)

如果要构建自定义排序,可以使用.sort:

def lis = []

lis << [3, [1,2,4]]
lis << [1, [1,2,3]]
lis << [3, [1,2,3]]
lis << [1, [4,5,6]]
lis << [2, [1,2,3]]

lis.sort{a,b->
    if(a[0]==b[0])
    {
        def aArray = a[1]
        def bArray = b[1]
        for(int i=0;i<aArray.size();i++)
        {
            if(bArray[i])
            {
                if(aArray[i]!=bArray[i])
                {
                    return aArray[i]<=>bArray[i]
                }
            }
            else
            {
                return 1
            }
        }    
        return 0
    }
    else
        return a[0]<=>b[0]
}


lis.each{x->
println x
}

我并没有真正处理这样的情况,即列表的长度可以根据您的应用需求进行改进。