J'ai déclaré une carte comme ci-dessous:
String deptname = ['Department'] String empnames = [['Test1']['Test2']] if (deptname != null) { if (test.containsKey(deptname)) { /// } else { test.put(deptname, new String[]{empnames}); } }
J'ai une variable empnames qui est un tableau et deptname est une chaîne et j'ai déclaré le deptname et empnames comme ci-dessous: p >
Map<String, String[]> test = new HashMap<String, String[]>();
Si la carte de test contient déjà la clé deptname, alors dans quelle condition dois-je écrire si condition pour ajouter de nouvelles valeurs au service?
4 Réponses :
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); }
J'essaie d'exécuter votre code et j'obtiens des erreurs car ma déclaration de carte est différente.Dois-je changer la déclaration de carte?
Vous pouvez utiliser les nouvelles méthodes de Java 8 comme putIfAbsent
pour ajouter une nouvelle entrée si la clé n'est pas présente et computeIfPresent
pour ajouter des valeurs à une clé existante d'un map.
Un exemple serait:
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); } }
Ici, putIfAbsent
teste si la clé est présente, sinon ajoute une nouvelle valeur-clé entrée. Le computeIfAbsent
d'autre part teste si la clé est présente, si oui, il calcule la nouvelle valeur pour l'entrée clé-valeur existante.
La sortie du code ci-dessus est:
Test1 Test2 Test3
En effet, au départ, la clé Department
n'était pas présente dans la carte test
, elle y a donc été ajoutée avec la valeur empnames
sous forme de tableau.
Dans la deuxième opération, la méthode computeIfPresent
a vérifié que la clé Department
était déjà dans la carte, il a donc ajouté la nouvelle chaîne Test3
au tableau de valeurs existant de [Test1, Test2]
.
La même chose peut être faite pour un Liste
au lieu d'un tableau:
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); } }
Comme d'autres l'ont suggéré, ce serait plus facile si vous aviez une ArrayList au lieu de String []. Mais puisque vous avez une chaîne [], vous devrez créer un nouveau tableau de old_array's_size + list_to_add et copier les valeurs de l'ancien tableau dans le nouveau plus la nouvelle valeur que vous voulez ajouter.
Donc à l'intérieur de votre instruction 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
Encore une fois, si vous utilisiez une sorte de liste, ce serait plus facile. Une bonne raison en plus de pouvoir ajouter est que vous pouvez facilement le trier par ordre alphabétique en utilisant Collections.sort.
Puisque vous avez tagué [grails], je suppose qu'une réponse Groovy est également appropriée. Vous pouvez utiliser une carte avec .withDefault {...}
pour fournir le contenu au cas où la clé serait manquante. Par exemple,
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']
est un code valide mais ne fait probablement pas ce que vous pensez. Plus probablement, vous voulezString deptname = 'Department'
. Mis à part cela,String empnames = [['Test1'] ['Test2']]
n'est pas vraiment un code valide. Cela va essayer de résoudre une propriété nomméeTest2
sur une instance deString
, qui bien sûr n'existe pas (la propriétéTest2
n'existe pas exister).