Heim > Java > javaLernprogramm > Java-Klassenbibliothek-Guava-Bimap

Java-Klassenbibliothek-Guava-Bimap

黄舟
Freigeben: 2017-01-19 13:18:42
Original
1562 Leute haben es durchsucht

BiMap bietet einen neuen Sammlungstyp, der eine bidirektionale zugeordnete Datenstruktur aus Schlüssel und Wert bereitstellt.

Wenn wir Java Map verwenden, suchen wir normalerweise oft nach Werten über den Schlüssel, aber wenn das folgende Szenario auftritt, müssen wir zusätzlichen Code schreiben. Schauen wir uns zunächst die folgende Kartenstruktur an, die die Identifikationsnummer und den Dateinamen darstellt.

[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);        
    }
Nach dem Login kopieren

Wenn wir den Dateinamen anhand der Seriennummer finden müssen, ist das sehr einfach. Wenn wir jedoch die Seriennummer anhand des Dateinamens finden müssen, müssen wir die Karte durchsuchen. Natürlich können wir auch eine Map-Inversionsmethode schreiben, um die invertierte Mapping-Beziehung zu realisieren.

[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;
    }
Nach dem Login kopieren
[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);
    }
Nach dem Login kopieren


Der obige Code kann uns helfen, die Anforderungen der Karteninversion zu erfüllen, es gibt jedoch noch einige Probleme, die wir berücksichtigen müssen:

 1. Wie man damit umgeht Situation mit doppelten Werten. Wenn dies nicht berücksichtigt wird, erfolgt ein Überschreiben während der Invertierung.

2. Wenn der invertierten Karte ein neuer Schlüssel hinzugefügt wird, muss die Karte vor der Invertierung einen Wert aktualisieren? Die Zahl der Dinge, die außer dem Geschäftlichen berücksichtigt werden müssen, nimmt zu und der geschriebene Code wird weniger lesbar. Zu diesem Zeitpunkt können wir die Verwendung von BiMap in Guava in Betracht ziehen.

Bimap

Bimap ist sehr einfach zu verwenden. Für das obige Verwendungsszenario können wir es mit sehr einfachem Code implementieren:

Bimap-Daten Obligatorische Eindeutigkeit
[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);
    }
Nach dem Login kopieren
Bei der Verwendung von BiMap ist die Einzigartigkeit von Value erforderlich. Wenn der Wert wiederholt wird, wird ein Fehler ausgelöst: java.lang.IllegalArgumentException, zum Beispiel:

[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"); 
    }
Nach dem Login kopieren
 logfileMap.put(5, "d.log") löst java.lang.IllegalArgumentException aus: Wert bereits vorhanden: Fehler in d.log. Wenn wir wirklich wiederholte Werte einfügen müssen, können wir die Methode „forcePut“ wählen. Wir müssen jedoch beachten, dass auch der vorherige Schlüssel überschrieben wird.

Verstehen der inversen Methode
[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}
Nach dem Login kopieren

Die inverse Methode gibt eine invertierte BiMap zurück. Beachten Sie jedoch, dass diese invertierte Karte kein neues Kartenobjekt ist, sondern eine Ansichtszuordnung implementiert, also Alle Operationen Das, was Sie an der umgekehrten Karte vornehmen, wirkt sich auf das ursprüngliche Kartenobjekt aus. Zum Beispiel:

Implementierungsklasse von BiMap
[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); 
    }
Nach dem Login kopieren

Key-Value Map Impl Value-Key Map Impl Entsprechende BiMap

HashMap HashBiMap

ImmutableMap ap ImmutableBiMap

EnumMap EnumMap EnumBiMap

EnumMap HashMap EnumHashBiMap

Das Obige ist der Inhalt der Java-Class Library-Guava-Bimap. Weitere verwandte Inhalte finden Sie unter PHP chinesische Website (www. php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage