web-dev-qa-db-fra.com

Supprimer une entrée de la carte sans itérer

Comment supprimer une entrée de Java Map sans utiliser l'itération à l'aide de la valeur ou de la clé. Fondamentalement, dans ma carte, j'utilise containsKey() puis map.remove() pour le supprimer.

8
monal86

Vous supprimez une entrée d'une carte en utilisant la clé de l'élément que vous souhaitez supprimer. 

map.remove("aKey");

Si vous ne connaissez pas la clé de l'élément, vous devez itérer pour l'obtenir de la manière suivante:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
     Set<T> keys = new HashSet<T>();
     for (Entry<T, E> entry : map.entrySet()) {
         if (value.equals(entry.getValue())) {
             keys.add(entry.getKey());
         }
     }
     return keys;
} 

Cela renverra toutes les clés trouvées sur la carte.

16
Alfredo Osorio
Map<Integer, String> abcMap = new HashMap<Integer, String>();
abcMap.put(1,"A");
abcMap.put(2,"B");
abcMap.put(3,"C");

/// now for remove item
abcMap.remove(1);
// this will remove "A" from abcMap..
8
mo sean

Dans la plupart des cas, vous pouvez supprimer une entrée (paire clé-valeur) d'une carte à l'aide de la méthode Map.remove(key). Il n'y aura pas d'itération sur la carte. Vous n'avez pas besoin d'utiliser Map.containsKey(key) avant Map.remove(key) car Map.remove le fait déjà. Il renvoie une valeur associée précédente avec key ou null s'il n'y a pas eu de mappage pour key.

Mais vous ne pouvez pas faire la même chose en utilisant uniquement une valeur (sans clé). La seule option consiste à parcourir la carte et à trouver une entrée (ou des entrées) avec cette valeur.

Java 5-7:

for (Iterator<MyValue> it = map.values.iterator(); it.hasNext(); ) {
    if(it.next().equals(myValue)) {
        it.remove();
    }
}

Java 8:

map.values().removeIf(v -> v.equals(myValue));
5
Simax

Utilisez Map#remove(Object key) :

public V remove(Object key)

Supprime le mappage de cette clé de cette carte s'il est présent (opération facultative). Plus formellement, si ce mappage contient un mappage de la clé k à la valeur v tel que (key==null ? k==null : key.equals(k)), ce mappage est supprimé. (La carte peut contenir au plus une telle cartographie.)

Retourne la valeur à laquelle la carte a précédemment associé la clé, ou null si la carte ne contenait aucune correspondance pour cette clé. (Un retour à zéro peut également indiquer que la mappe précédemment associée à null avec la clé spécifiée si l'implémentation prend en charge les valeurs null.) La mappe ne contiendra pas de mappage pour la clé spécifiée une fois l'appel renvoyé.

En gros, vous pouvez appeler supprimer, même si la clé n'existe pas. Il échouera silencieusement dans ce cas (retourne null). L'objet n'a pas besoin d'être identique ni identique, si yourKey.equals(key) est vrai pour la clé que vous voulez supprimer. 

3
Andrey Akhmetov
public Object remove(Object key)

Méthode remove dans Map.

De javadoc :

Supprime le mappage de cette clé de cette carte s'il est présent (opération facultative). Plus formellement, si ce mappage contient un mappage de la clé k à la valeur v tel que (key==null ? k==null : key.equals(k)),, ce mappage est supprimé. (La carte peut contenir au plus une telle cartographie.)

Retourne la valeur à laquelle la carte a précédemment associé la clé, ou null si la carte ne contenait aucune correspondance pour cette clé. (Un retour null peut également indiquer que la mappe précédemment associée à null avec la clé spécifiée si l'implémentation prend en charge les valeurs null.) La mappe ne contiendra pas de mappage pour la clé spécifiée une fois l'appel renvoyé.

Paramètres:

clé - clé dont la cartographie doit être supprimée de la carte.

Retourne :

Valeur précédente associée à la clé spécifiée, ou null s'il n'y a pas eu de mappage pour la clé.

Exemple:

Map<Integer, String> map=new HashMap<>();
    map.put(20, "stackOverflow");
    System.out.println(map.remove(20));

Ce code imprimera "stackOverflow" c’est-à-dire la valeur précédente associée à la clé spécifiée. J'espère que ça aide. 

2
Trying

Il semble que personne ici n'ait réellement répondu à la question de OP. Ils demandaient comment, sans utiliser d'itérateur, supprimer une entrée "en utilisant une valeur ou une clé" . Bien entendu, remove(key) fonctionne si vous avez la clé, mais pas si vous recherchez un valeur.

La réponse d'Alfredo était la plus proche, en ce sens qu'elle recherche le côté valeur de Map, mais utilise un itérateur.

Voici une solution utilisant l'API Stream de Java 8; pas d'itérateurs:

Map<K, V> newMap = map.entrySet().stream()
    .filter(entry -> !entry.getKey().equals(searchValue))
    .filter(entry -> !entry.getValue().equals(searchValue))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

(Remplacez K et V par vos types de clé et de valeur.)

1
Will Hains

Utilisez la méthode MapNAME __'S removeNAME_ , qui prend une clé en tant qu'argument. Vous n'avez pas besoin de l'objet original; vous avez simplement besoin d'un objet qui se compare à la clé existante de la carte avec equalset produit le même hashCodeque la clé existante de la carte.

1
rgettman

public static void main(String[] args) { //Constant.mapCustomer.remove("s"); Map<String, String> mapCustomer=new HashMap<String, String> ();; mapCustomer.put("s","ss"); System.out.println(mapCustomer.get("s")); mapCustomer.remove("s"); System.out.println(mapCustomer.get("s")); }

0
Gank