Понимание многомерных ассоциативных массивов в Groovy - PullRequest
0 голосов
/ 07 марта 2019

Первый раз, и у меня возникли трудности с пониманием массивов скриптов?(не уверен, являются ли они списком, массивами или картами).Я, как правило, закодировал в PHP и привык ассоциировать многомерные массивы PHP как (ключ => значение) ассоциации.Я не уверен, что пропускаю эту гибкость в Groovy.Похоже, вы либо должны выбрать либо карту / массив или список.

Что я пытаюсь сделать, так это то, что у меня есть другой статический массив, который я бы хотел связать с ключом -> значением.(например, 1 - Тим, 2 - Грег, 3 - Боб и т.д. ...) У меня есть еще один ассоциативный массив, который является полностью динамическим.Это должно быть вложено в ассоциативный массив, который я указывал выше, потому что в этом списке он будет содержать информацию о задачах, над которой работал текущий пользователь.(например, при Тиме он мог бы поработать над 3 несвязанными задачами в разное время, и статусы этих задач могли бы отличаться. Так что это должно соотноситься с чем-то вроде этого [Задача 1, 3/6/19, Завершенная задача], [Задача2, 3/5/19, Выполненная задача], [Задача 3, 2/5/19, Выполняемая задача]. У кого-то по имени Грег может быть задание вместо 4.

Так что мой вопрос: что лучше?структура данных для использования? Как эффективно добавить данные в эту структуру данных?

Извините, если они кажутся базовыми вопросами. Опять же, я новичок в Groovy.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019
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, вы действительно можете просто сделать все итерации более многословными, используя коллекцию, вы можете сделать это в одну строку:

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']
}
0 голосов
/ 07 марта 2019

Базовыми структурами данных, которые являются поисками по ключу / значению, являются просто Java Map s (обычно реализация LinkedHashMap в Groovy).Ваша ассоциация первого уровня выглядит как 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 на всех ваших классах, когда это возможно, и быть уверенным, что вы понимаете все случаи, когда вы не можете его использовать.Это поможет предотвратить ошибки и ошибки в процессе обучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...