Перенос значений на карту, когда ключ уже существует на карте - PullRequest
1 голос
/ 21 марта 2019

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

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

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

Ответы [ 4 ]

2 голосов
/ 21 марта 2019

Поскольку вы пометили [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']]
1 голос
/ 21 марта 2019

Вы можете использовать новые методы в Java 8, такие как putIfAbsent, чтобы добавить новую запись, если ключ отсутствует, и computeIfPresent, чтобы добавить значения к существующему ключуmap.

Примером может быть:

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);
       }
 }
0 голосов
/ 21 марта 2019

Как предлагали другие, это было бы проще, если бы у вас был 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.

0 голосов
/ 21 марта 2019
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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...