如何在groovy中对下面的列表列表进行排序

时间:2012-01-27 02:14:51

标签: sorting collections groovy

我有一个像这样的groovy列表

 udbmslList=[
           [133, 2011-11-30 00:00:00.0], 
           [141, 2011-11-29 00:00:00.0], 
           [132, 2011-11-28 00:00:00.0], 
           [11, 2011-12-03 00:00:00.0], 
           [119, 2011-12-02 00:00:00.0], 
           [182, 2011-12-01 00:00:00.0], 
           [12, 2011-12-04 00:00:00.0]
           ]

如何将上面的列表排序到单个列表/地图中,或者按照日期的升序保持相同的结构(列表列表)(上面的列表中不能有2个相同的日期) 另外我想删除日期的时间部分。 感谢

3 个答案:

答案 0 :(得分:1)

要对列表进行排序,假设它们实际上是日期,而不是显示的无效立即:

sorted = udbmslList.sort { it[1] }

使用SimpleDateFormat或Groovy的Date扩展程序不会删除时间。

创建一个具有相同结构但只有日期字符串元素的数组(使用一些假数据):

s = udbmslList.sort { it[1] }.collect { [it[0], it[1].format('yyyy-MM-dd')] }
=> [[141, 2012-01-26], [133, 2012-01-26], [11, 2012-01-26]]

答案 1 :(得分:0)

要对列表进行排序,请使用udbmslList.sort { it[1] }

要显示没有时间的日期,您可以使用类似udbmslList.each { println it[1].format('yyyy-MM-dd') }的内容。

答案 2 :(得分:0)

假设日期是字符串,因为它们似乎是yyyy-MM-dd格式,它们可以按字典顺序排序。

def udbmslList=[
    [133, "2011-11-30 00:00:00.0"], 
    [141, "2011-11-29 00:00:00.0"], 
    [132, "2011-11-28 00:00:00.0"], 
    [11,  "2011-12-03 00:00:00.0"], 
    [119, "2011-12-02 00:00:00.0"], 
    [182, "2011-12-01 00:00:00.0"], 
    [12,  "2011-12-04 00:00:00.0"]
]

// Get rid of the timestamp part of the date and convert into a map.
def result = udbmslList.collectEntries { 
    [(it[0]): it[1].split()[0]] 
}

// Sort by date lexicographically.
result.sort { it.value }

assert result == [
    132: "2011-11-28", 
    141: "2011-11-29", 
    133: "2011-11-30", 
    182: "2011-12-01", 
    119: "2011-12-02", 
    11: "2011-12-03", 
    12: "2011-12-04"
]

修改:如果日期为Date个对象,则可以先按日期对列表进行排序,然后将其转换为适当格式的地图:

def result = udbmslList.sort { it[1] }
                       .collectEntries { [(it[0]): it[1].format('yyyy-MM-dd')] }