【问题标题】:Grails - sort collection by an element AND an arrayGrails - 按元素和数组对集合进行排序
【发布时间】:2012-11-19 20:21:00
【问题描述】:

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

例子:

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

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

提前致谢

【问题讨论】:

    标签: arrays sorting grails collections


    【解决方案1】:

    如果要建立自定义排序,可以使用 .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
    }
    

    我没有很好地处理列表长度不同的情况,您可以根据自己的应用需求对其进行改进。

    【讨论】:

    • 在我的例子中,我的数组总是有两个元素,子数组有可变长度,你处理得很好。非常感谢。
    • 现在如果子数组有 1,2,3 与 1,2,3,4 相比,它会显示它们相等,因为它会退出使用 aArray 完成的 for 循环,因为如果您可能想根据您的应用程序确定要做什么,例如考虑缺少数字 0 进行比较可能是有意义的,或者您可以将它们视为数字的最大值或最小值。
    • 我这样做了,而不是返回 0,我返回:return aArray.size() bArray.size() 因为如果数组具有相同的数字,那真的没关系。但是如果 bArray 更长,这很重要,在这种情况下,我会将较短的数组放在第一位。
    【解决方案2】:

    看看下面的gisttim 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]]] 
    

    希望对您有所帮助...

    【讨论】:

    • 谢谢,对不起,我忘了提,但我不知道子数组的长度,它可以在每个元素中变化。
    • 数组应该如何比较?
    • 杰夫的回答效果很好。但是,当您知道长度时,这是一个好主意。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多