Maison  >  Article  >  Java  >  Bibliothèque de classes Java-Guava-Bimap

Bibliothèque de classes Java-Guava-Bimap

黄舟
黄舟original
2017-01-19 13:18:421518parcourir

BiMap fournit un nouveau type de collection, qui fournit une structure de données associée bidirectionnelle de clé et de valeur.

Normalement, lorsque nous utilisons Java Map, nous recherchons souvent une valeur via la clé, mais si le scénario suivant se produit, nous devons écrire du code supplémentaire. Tout d’abord, examinons la structure de carte suivante qui représente le numéro d’identification et le nom du fichier.

[code]  
    @Test
    public void logMapTest(){
        Map<Integer,String> logfileMap = Maps.newHashMap();
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log");        
        System.out.println("logfileMap:"+logfileMap);        
    }

Lorsque nous avons besoin de trouver le nom du fichier par numéro de série, c'est très simple. Mais si nous devons trouver le numéro de série via le nom du fichier, nous devons parcourir la carte. Bien sûr, nous pouvons également écrire une méthode d'inversion de carte pour aider à réaliser la relation de cartographie inversée.

[code] /**
     * 逆转Map的key和value
     * @param <S>
     * @param <T>
     * @param map
     * @return
     */
    public static <S,T> Map<T,S> getInverseMap(Map<S,T> map) {
        Map<T,S> inverseMap = new HashMap<T,S>();
        for(Entry<S,T> entry: map.entrySet()) {
            inverseMap.put(entry.getValue(), entry.getKey());
        }
        return inverseMap;
    }
[code] @Test
    public void logMapTest(){
        Map<Integer,String> logfileMap = Maps.newHashMap();
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log");

        System.out.println("logfileMap:"+logfileMap);

        Map<String,Integer> logfileInverseMap = Maps.newHashMap();

        logfileInverseMap=getInverseMap(logfileMap);

        System.out.println("logfileInverseMap:"+logfileInverseMap);
    }


Le code ci-dessus peut nous aider à réaliser les exigences d'inversion de carte, mais il reste encore quelques problèmes à prendre en compte :

 1. Comment gérer situation de valeurs en double. Si cela n'est pas pris en compte, un écrasement se produira lors de l'inversion

2. Si une nouvelle clé est ajoutée à la carte inversée, la carte avant l'inversion doit-elle mettre à jour une valeur

Dans ce cas, le nombre de choses autres que les affaires qui doivent être prises en compte augmente et le code écrit devient moins lisible. À l’heure actuelle, nous pouvons envisager d’utiliser BiMap dans Guava.

Bimap

Bimap est très simple à utiliser Pour le scénario d'utilisation ci-dessus, nous pouvons l'implémenter avec un code très simple :

[code] @Test
    public void BimapTest(){
        BiMap<Integer,String> logfileMap = HashBiMap.create(); 
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log"); 
        System.out.println("logfileMap:"+logfileMap); 
        BiMap<String,Integer> filelogMap = logfileMap.inverse();
        System.out.println("filelogMap:"+filelogMap);
    }
Données Bimap Unicité obligatoire

Lors de l'utilisation de BiMap, l'unicité de Value sera requise. Si la valeur est répétée, une erreur sera générée : java.lang.IllegalArgumentException, par exemple :
[code]  @Test
    public void BimapTest(){
        BiMap<Integer,String> logfileMap = HashBiMap.create(); 
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log");         
        logfileMap.put(4,"d.log"); 
        logfileMap.put(5,"d.log"); 
    }

 logfileMap.put(5, "d.log") lancera java.lang.IllegalArgumentException : valeur déjà présente : erreur dans d.log. Si nous avons vraiment besoin d'insérer des valeurs répétées, nous pouvons choisir la méthode forcePut. Mais ce qu’il faut noter, c’est que la clé précédente sera également écrasée.

[code] @Test
    public void BimapTest(){
        BiMap<Integer,String> logfileMap = HashBiMap.create(); 
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log"); 

        logfileMap.put(4,"d.log"); 
        logfileMap.forcePut(5,"d.log"); 
        System.out.println("logfileMap:"+logfileMap); 
    }

    输出:
    logfileMap:{5=d.log, 3=c.log, 2=b.log, 1=a.log}

Comprendre la méthode inverse

La méthode inverse renverra un BiMap inversé, mais notez que cette carte inversée n'est pas un nouvel objet cartographique, elle implémente une association de vues, donc Toutes les opérations que vous effectuez sur la carte inversée affectera l'objet cartographique d'origine. Par exemple :

[code]
    @Test
    public void BimapTest(){
        BiMap<Integer,String> logfileMap = HashBiMap.create(); 
        logfileMap.put(1,"a.log");
        logfileMap.put(2,"b.log");
        logfileMap.put(3,"c.log"); 
        System.out.println("logfileMap:"+logfileMap); 
        BiMap<String,Integer> filelogMap = logfileMap.inverse();
        System.out.println("filelogMap:"+filelogMap);

        logfileMap.put(4,"d.log"); 

        System.out.println("logfileMap:"+logfileMap); 
        System.out.println("filelogMap:"+filelogMap); 
    }

Classe d'implémentation de BiMap

Key-Value Map Impl Value-Key Map Impl BiMap correspondant

HashMap HashBiMap

ImmutableMap ap ImmutableBiMap

EnumMap EnumMap EnumBiMap

EnumMap HashMap EnumHashBiMap

Ce qui précède est le contenu de Java-Class Library-Guava-Bimap Pour plus de contenu connexe, veuillez prêter attention au. Site Web chinois PHP (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn