了解Groovy中的多维关联数组

时间:2019-03-06 22:12:36

标签: java arrays grails groovy

第一次发布,我在理解groovy脚本数组时遇到一些困难吗? (不确定它们是列表,数组还是映射)。我通常使用PHP进行编码,并且习惯于将PHP多维数组关联为(key => value)关联。我不确定我是否忽略了Groovy中的灵活性。似乎您要么必须选择一个map / array组合,要么要选择一个列表。

我要完成的工作是我有一个静态的关联数组,我希望将其与键->值关联。 (例如1-Tim,2-Greg,3-Bob等)。 我有另一个关联数组,它是完全动态的。这需要嵌套在我上面提到的关联数组中,因为在此列表中它将包含当前用户已经处理过的任务信息。 (例如,在蒂姆领导下,他可能在不同的时间从事3个无关的任务,并且这些任务的状态可能会有所不同。因此,这应该与[Task 1,3/6/19,Completed Task],[Task 2,3/5/19,已完成的任务],[任务3,2/5/19,进行中的任务]。一个叫Greg的人可能有4个任务。

所以我的问题是为此使用的最佳数据结构是什么?如何有效地向该数据结构添加数据?

很抱歉,如果这些问题看起来像是基本问题。再次,我是Groovy的新手。

2 个答案:

答案 0 :(得分:0)

作为键/值查找的基本数据结构只是Java Map(在Groovy中通常为LinkedHashMap实现)。您的一级关联似乎类似于Map<Integer, Employee>。嵌套的您称为“完全动态”的类似乎实际上是一个结构化的类,您绝对应该学习Java / Groovy类的工作方式。这似乎是您想要的东西:

class Employee {
    int employeeId
    String name
    List<Task> tasks
}

enum TaskStatus {
    PENDING,
    IN_PROGRESS,
    COMPLETED
}

class Task {
    int taskNumber
    LocalDate date // java.time.LocalDate
    TaskStatus status
}

顺便说一句,Groovy是一种很棒的语言,也是我偏爱的JVM语言,但是最好确保先了解基础知识。我建议尽可能在所有班级上使用@CompileStatic,并确保您了解在任何情况下都无法使用它。这将有助于防止您在学习过程中出现错误和失误。

答案 1 :(得分:0)

Map model=[:]

List names=['Tim','Greg','Bob']

names?.each { name->
  //dynamically call something that returns a list
 //  model."${name}"= getSomeList(name)


//get a list assign it the above list maybe something like this
//   List someTasks = ['task1','task2'] 
//   model."${name}"=  someTasks
//or shorter
//    model."${name}"=  ['task1','task2'] 

// 1 element multi element list
    if (name=='Bob') {
      model."${name}"=  ['task1']
    } else {
      model."${name}"=  ['task1','task2'] 
    }
}

//This iterates through map and its value being another iteration
model?.each{ key,value ->
  println "working on $key" 
   value?.each { v-
     println "$key has task ${v}"
    }
}

尝试上述方法可以帮助您更好地理解它,是的,您可以使用<<

Map model=[:]
model << ['bob':['task1']]
model << ['Greg':['task1','task2']]

您可以像后面那样或上面那样通过迭代来映射该列表中的其他列表/地图,例如:

model << ['Greg':[ 
                'task1' :  ['do thing1','do thing2'], 
                'task2': [ 'do xyz', 'do abc'] 
               ]
          ]

//This iterates through map and its value being another map with an iteration
model?.each{ key,value ->
  println "working on $key" 
   value?.each {k, v->
     println "$key  has task ${k}"
       v?.each { vv ->
          println "$key has task ${k} which needs to do ${vv}"
         }
    }
}

实际上,您可以使用collect来简化所有的迭代过程,而这要冗长得多,使用collection可以将它变成一行:

names?.collect{[it:getSomeList(it)]} 

//sometimes you need to flatten in this case I dont think you would
names?.collect{[it:seriesHotelList(it)]}?.flatten() 

List getSomeList(String name) {
  return ['task1','task2']
}