2

这是我的清单

List a = ["Sep->Day02->FY21;Inter01","Sep->Day02->FY21;Inter02","Sep->Day02->FY21;Inter03","Sep->Day01->FY21;Inter18","Sep->Day01->FY21;Inter19"]

我正在尝试对此进行分组并生成一个新字符串

预期结果

"Sep->Day02->FY21",Inter01:Inter03
"Sep->Day01->FY21",Inter18:Inter19

试图这样做

List a = ["Sep->Day02->FY21;Inter01","Sep->Day02->FY21;Inter02","Sep->Day02->FY21;Inter03","Sep->Day01->FY21;Inter18","Sep->Day01->FY21;Inter19"] 
List b = []
a.each{
b.add(it.split(";"))
}
def c = b.groupBy{it[0]}
println c
c.each{
 k, v -> println "${v}"
}

我找不到在字符串中获取 Inter01:Inter03 范围的方法。请指教。

编辑

Marmite 提供的解决方案按预期在 groovy 控制台中工作。我生成的列表来自地图中的值。

a.add(map[z]) Where z is the key.

当我尝试使用它时,它给了我最大和最小方法未找到错误。

尝试使用 map[z].toString()。还是一样。值来自地图的事实是否影响相同?

代码片段 下面是我如何生成地图

def map = [:]

itr.each{
def Per = it.getMemberName("Period") //getMemberName is a product specific function . Sample output May
def Day = it.getMemberName("Day") //Day01 sample output
def Hour = it.getMemberName("Hour") //Interval01 sample output
def HourInt = it.getMemberName("Hour").reverse().take(2).reverse()
def Year = it.getMemberName("Years")
map.put(it.DataAsDate.format("dd/MM/yyyy")+"-"+Hour,Year+"->"+Per+"->"+Day+";"+HourInt)
}

下面是我生成列表的地方


def OSTinterval = OST.reverse().take(2).reverse() as Integer //This creates 01 out of Interval01
def OETinterval = OET.reverse().take(2).reverse() as Integer //This creates 03 out of Interval03

D1 = new Date(OSDDay)
D2 = new Date(OEDDay)
if (D1 == D2)
{
(OSTinterval..OETinterval).each
{inter ->
z = OSDDay+"-"+"Interval"+inter.toString().padLeft(2,'0')
coll.add(map[z].toString())
}
}
else
{
(D1..D2).each { 
if (it == D1){
(OSTinterval..48).each
{inter ->
z = OSDDay+"-"+"Interval"+inter.toString().padLeft(2,'0')
coll.add(map[z].toString())
}

4

1 回答 1

3

基本上你正在寻找minmax分组之后。

我正在使用一些简化的数据来专注于处理:

def a = ['D02;I01','D02;I02','D02;I03','D01;I18','D01;I18']

println  a.collect{it.split(";")}
          .groupBy{it[0]}
          .collect{k,v -> [k,v.collect {it[1]}]}
          .collect{[it[0],"${it[1].min()}:${it[1].max()}"]}
          .collect{it.join(',')}

返回具有最小值和最大值的键列表

[D02,I01:I03, D01,I18:I18]

之后的结果groupBy

[D02:[[D02, I01], [D02, I02], [D02, I03]], D01:[[D01, I18], [D01, I18]]]

下一个collect删除重复的键

[[D02, [I01, I02, I03]], [D01, [I18, I18]]]

最后你找到 列表的minandmax

[[D02, I01:I03], [D01, I18:I18]] 
于 2020-10-18T07:48:56.123 回答