Я объявил карту, как показано ниже:
Map<String, String[]> test = new HashMap<String, String[]>();
У меня есть переменная empnames, которая представляет собой массив, а deptname — это строка, и я объявил deptname и empnames, как показано ниже:
String deptname = ['Department']
String empnames = [['Test1']['Test2']]
if (deptname != null)
{
if (test.containsKey(deptname))
{
///
}
else
{
test.put(deptname, new String[]{empnames});
}
}
Если тестовая карта уже содержит ключ имени отдела, то какое условие я должен написать, если условие для добавления новых значений в отдел?




ArrayList<String> departmentList;
if (test.containsKey(key)){
// if the key has already been used, then and add a new value to it
list = test.get(key);
list.add(value);
test.put(key, list);
} else {
// if the key hasn't been used yet, then create a new ArrayList<String> object, add the value
list = new ArrayList<String>();
list.add(value);
test.put(key, list);
}
Я пытаюсь запустить ваш код и получаю ошибки, так как моя декаляция карты отличается. Нужно ли мне менять объявление карты?
Вы можете использовать новые методы в Java 8, такие как putIfAbsent, чтобы добавить новую запись, если ключ отсутствует, и computeIfPresent, чтобы добавить значения к существующему ключу карты.
Примером может быть:
public static void main(String[] args) {
Map<String, String[]> test = new HashMap<>();
String deptname = "Department";
String[] empnames = {"Test1", "Test2"};
if (deptname != null){
test.putIfAbsent(deptname, empnames);
test.computeIfPresent(deptname, (dept, value) -> {
List<String> list = new ArrayList<>(Arrays.asList(value));
list.add("Test3");
value = list.toArray(value);
return value;
});
}
for(String s : test.get("Department")){
System.out.println(s);
}
}
Здесь putIfAbsent проверяет наличие ключа, если нет, добавляет новую запись ключ-значение. С другой стороны, computeIfAbsent проверяет, присутствует ли ключ, и если да, то вычисляет новое значение для существующей записи ключ-значение.
Вывод приведенного выше кода:
Test1
Test2
Test3
Это связано с тем, что изначально ключ Department отсутствовал в карте test, поэтому он был добавлен к ней вместе со значением empnames в виде массива.
Во второй операции метод computeIfPresent проверил, что ключ Department уже есть на карте, поэтому он добавил новую строку Test3 к существующему массиву значений [Test1, Test2].
То же самое можно сделать для List вместо массива:
public static void main(String[] args) {
Map<String, List<String>> test = new HashMap<>();
String deptname = "Department";
List<String> empnames = new ArrayList(Arrays.asList("Test1", "Test2"));
if (deptname != null){
test.putIfAbsent(deptname, empnames);
test.computeIfPresent(deptname, (dept, value) -> {
value.add("Test3");
return value;
});
}
for(String s : test.get("Department")){
System.out.println(s);
}
}
Как предлагали другие, это было бы проще, если бы у вас был ArrayList вместо String[]. Но поскольку у вас есть String[], вам придется создать новый массив из old_array's_size + list_to_add и скопировать значения из старого массива в новый плюс новое значение, которое вы хотите добавить.
Итак, внутри вашего оператора if:
String [] oldList = test.get(deptName);
String[] newList = new String[oldList.length + empnames.length]; //Make a new array with enough space for the previous values at deptname but also the new ones you want to add
//Put all of the values from the existing value at deptname into a new array
for (int i = 0; i < oldList.length; i++)
newList[i] = oldList[i];
//Put all of the values from the list of values you want to add into the new array
for (int i = 0; i < empnames.length; i++)
newList[oldList.length + i] = empnames[i];
test.put(deptname, newList); //Put the completed list back into the map
Опять же, если бы вы использовали какой-то список, это было бы проще. Еще одна хорошая причина, помимо возможности добавления, заключается в том, что вы можете легко отсортировать его по алфавиту с помощью Collections.sort.
Поскольку вы отметили [grails], я предполагаю, что ответ Groovy также подходит. Вы можете использовать Карту с .withDefault{ ... }, чтобы предоставить контент в случае отсутствия ключа. Например.
def data = [["x", ["a", "b"]], ["x", ["c", "d"]]]
def test = [:].withDefault{[]} // XXX
data.each{ k, vs ->
test[k].addAll(vs) // if there is no key `k`, create an empty array, so `.addAll` just works
}
println(test.inspect())
// => ['x':['a', 'b', 'c', 'd']]
String deptname = ['Department']является действительным кодом, но, вероятно, не делает то, что вы думаете. Скорее всего, вы хотитеString deptname = 'Department'. Кроме того,String empnames = [['Test1']['Test2']]не является действительным кодом. Это попытается разрешить свойство с именемTest2в экземпляреString, которого, конечно же, не существует (свойствоTest2не существует).