了解 Groovy 中的多维关联数组
Understanding multidimensional, associative array's in Groovy
第一次发帖,我在理解 groovy 脚本数组时遇到一些困难? (不确定它们是列表、数组还是映射)。我通常在 PHP 中编码,并且习惯于将 PHP 多维数组关联为(键 => 值)关联。我不确定我是否忽略了 Groovy 中的灵活性。看来您要么必须选择 map/array 组合,要么必须选择列表。
我想要完成的是我有另一个静态关联数组,我想将其与键 -> 值关联。 (例如 1 - Tim,2 - Greg,3 - Bob,等等...)
我有另一个完全动态的关联数组。这需要嵌套在我上面提到的关联数组中,因为在此列表中它将包含当前用户已处理的任务信息。 (例如,在 Tim 的领导下,他可能在不同的时间处理了 3 个不相关的任务,并且这些任务的状态可能会有所不同。所以这应该与这样的事情相关联 [Task 1, 3/6/19, Completed Task], [Task 2, 3/5/19, Completed Task], [Task 3, 2/5/19, In Progress Task]. 名为 Greg 的人可能有 4 个任务。
所以我的问题是最好的数据结构是什么?如何有效地向这个数据结构添加数据?
如果这些看起来像是简单的基本问题,我很抱歉。同样,我是 Groovy.
的新手
key/value 查找的基本数据结构只是 Java Map
(通常是 Groovy 中的 LinkedHashMap
实现)。你的一级联想好像是Map<Integer, Employee>
。您调用的嵌套 "total dynamic" 似乎实际上是一个结构化的 class,您绝对应该了解 Java/Groovy class 是如何工作的。这似乎是您正在寻找的东西:
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 语言,但最好先确保您了解基础知识。我建议尽可能在所有 classes 上使用 @CompileStatic
,并确保您了解无法使用它的任何情况。这将有助于防止您在学习过程中出现错误和失误。
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']]
您可以通过在该列表中进一步迭代 lists/maps 像后者或上面那样映射,例如:
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
你真的可以简单地完成所有的 each 迭代,这会更加冗长,使用 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']
}
第一次发帖,我在理解 groovy 脚本数组时遇到一些困难? (不确定它们是列表、数组还是映射)。我通常在 PHP 中编码,并且习惯于将 PHP 多维数组关联为(键 => 值)关联。我不确定我是否忽略了 Groovy 中的灵活性。看来您要么必须选择 map/array 组合,要么必须选择列表。
我想要完成的是我有另一个静态关联数组,我想将其与键 -> 值关联。 (例如 1 - Tim,2 - Greg,3 - Bob,等等...) 我有另一个完全动态的关联数组。这需要嵌套在我上面提到的关联数组中,因为在此列表中它将包含当前用户已处理的任务信息。 (例如,在 Tim 的领导下,他可能在不同的时间处理了 3 个不相关的任务,并且这些任务的状态可能会有所不同。所以这应该与这样的事情相关联 [Task 1, 3/6/19, Completed Task], [Task 2, 3/5/19, Completed Task], [Task 3, 2/5/19, In Progress Task]. 名为 Greg 的人可能有 4 个任务。
所以我的问题是最好的数据结构是什么?如何有效地向这个数据结构添加数据?
如果这些看起来像是简单的基本问题,我很抱歉。同样,我是 Groovy.
的新手 key/value 查找的基本数据结构只是 Java Map
(通常是 Groovy 中的 LinkedHashMap
实现)。你的一级联想好像是Map<Integer, Employee>
。您调用的嵌套 "total dynamic" 似乎实际上是一个结构化的 class,您绝对应该了解 Java/Groovy class 是如何工作的。这似乎是您正在寻找的东西:
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 语言,但最好先确保您了解基础知识。我建议尽可能在所有 classes 上使用 @CompileStatic
,并确保您了解无法使用它的任何情况。这将有助于防止您在学习过程中出现错误和失误。
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']]
您可以通过在该列表中进一步迭代 lists/maps 像后者或上面那样映射,例如:
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
你真的可以简单地完成所有的 each 迭代,这会更加冗长,使用 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']
}