zoukankan      html  css  js  c++  java
  • Guava包学习---Bimap

      Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key-》value,value-》key,也就是你可以通过key定位value,也可以用value定位key。

    这个场景在日常开发中还是经常碰到的。

    其实,Bimap相对比较简单,它是一个接口,扩展了Map接口,里面也是<K,V>格式,只不过它不允许有重复的V,这一点很重要,当你尝试往里面put一个重复的V的是会有报错信息提示。没有重复的V也就保证了你把这个map倒置的时候从V定位K也是可以唯一定位到的,我们可以看一下它的实现:

    老习惯,还是看HashBimap,新集合类的创建基本上都是使用create方法:

    public static <K, V> HashBiMap<K, V> create() {
        return create(16);
      }
      public static <K, V> HashBiMap<K, V> create(int expectedSize) {
        return new HashBiMap<K, V>(expectedSize);
      }

    它的增删改查基本上和普通map没有区别,除了不能插入相同的value进去。

    重点在于它有一个reverse函数:

    @Override
      public BiMap<V, K> inverse() {
        return (inverse == null) ? inverse = new Inverse() : inverse;
      }
    
      private final class Inverse extends AbstractMap<V, K> implements BiMap<V, K>, Serializable {
        BiMap<K, V> forward() {
          return HashBiMap.this;
        }
    
        @Override
        public int size() {
          return size;
        }
    
        @Override
        public void clear() {
          forward().clear();
        }
    
        @Override
        public boolean containsKey(@Nullable Object value) {
          return forward().containsValue(value);
        }
    
        @Override
        public K get(@Nullable Object value) {
          return Maps.keyOrNull(seekByValue(value, smearedHash(value)));
        }
    
        @Override
        public K put(@Nullable V value, @Nullable K key) {
          return putInverse(value, key, false);
        }
    
        @Override
        public K forcePut(@Nullable V value, @Nullable K key) {
          return putInverse(value, key, true);
        }
    
        @Override
        public K remove(@Nullable Object value) {
          BiEntry<K, V> entry = seekByValue(value, smearedHash(value));
          if (entry == null) {
            return null;
          } else {
            delete(entry);
            entry.prevInKeyInsertionOrder = null;
            entry.nextInKeyInsertionOrder = null;
            return entry.key;
          }
        }

    其实把<K,V>变成了<V,K>,并且这个reverse是在后面你再次对于map进行修改,它也会跟着变化,所以不用担心它是一次性的,否则那不如自己去迭代获得一个新的map出来:

    public void testBimap(){
            HashBiMap<String,String> map = HashBiMap.create();
            map.put("1", "2");
            map.put("3", "4");
            System.out.println(map.toString());
            System.out.println(map.inverse().toString());
            map.put("5", "6");
            System.out.println(map.inverse().toString());
        }

    {1=2, 3=4}
    {2=1, 4=3}
    {2=1, 4=3, 6=5}

    到此为止,接下来看最后一个Guava的集合类Table。

  • 相关阅读:
    DirectShow基础编程 源Filter CSource CSourceStream (转)
    9.1 4*4矩阵键盘驱动
    实验8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim
    实验8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim
    实验8 #第8章 Verilog有限状态机设计-1 #Verilog #Quartus #modelsim
    习题8 #第8章 Verilog有限状态机设计-4 #Verilog #Quartus #modelsim
    习题8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim
    习题8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim
    习题8 #第8章 Verilog有限状态机设计-1 #Verilog #Quartus #modelsim
    Multisim 14.0 安装教程
  • 原文地址:https://www.cnblogs.com/congsg2016/p/5122785.html
Copyright © 2011-2022 走看看