当地图中已存在键时,将值推送到地图上

时间:2019-03-21 06:04:18

标签: java dictionary grails

我已经声明了如下地图:

 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 个答案:

答案 0 :(得分:2)

由于您标记了[grails],因此我认为Groovy答案也是合适的。您可以将带有tabIndex="0"的地图用于提供内容,以防丢失密钥。例如

.withDefault{ ... }

答案 1 :(得分:1)

如果键不存在,您可以使用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);
       }
 }

答案 2 :(得分:0)

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

答案 3 :(得分:0)

正如其他人所建议的那样,如果您使用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轻松按字母顺序对其进行排序。