Нажимайте значения на карту, когда ключ уже существует на карте

Я объявил карту, как показано ниже:

 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}); 
                }
            }

Если тестовая карта уже содержит ключ имени отдела, то какое условие я должен написать, если условие для добавления новых значений в отдел?

String deptname = ['Department'] является действительным кодом, но, вероятно, не делает то, что вы думаете. Скорее всего, вы хотите String deptname = 'Department'. Кроме того, String empnames = [['Test1']['Test2']] не является действительным кодом. Это попытается разрешить свойство с именем Test2 в экземпляре String, которого, конечно же, не существует (свойство Test2 не существует).
Jeff Scott Brown 26.03.2019 20:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
590
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
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);
    }

Я пытаюсь запустить ваш код и получаю ошибки, так как моя декаляция карты отличается. Нужно ли мне менять объявление карты?

Studentlearner 21.03.2019 07:41

Вы можете использовать новые методы в 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']]

Другие вопросы по теме