我已经声明了如下地图:
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键,那么如果要向部门附加新值的条件我应该写什么条件?
答案 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轻松按字母顺序对其进行排序。