1
votes

Pousser les valeurs vers une carte lorsque la clé existe déjà dans une carte

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?


1 commentaires

String deptname = ['Department'] est un code valide mais ne fait probablement pas ce que vous pensez. Plus probablement, vous voulez String 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ée Test2 sur une instance de String , qui bien sûr n'existe pas (la propriété Test2 n'existe pas exister).


4 Réponses :


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

1 commentaires

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?



1
votes

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


0 commentaires

0
votes

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.


0 commentaires

2
votes

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']]


0 commentaires