google guava's BiMap

Description:

google guava 中提供的一种非常有用的数据结构,双向 Map。是的,你没有听错,就是相比于普通仅能够提供 key 到 value 映射的 Map ,双向Map既能够提供 key 到 value 的映射,有能够提供 value 到 key 的映射。
这在某些特定场合是非常有用的,那么接下来简单介绍一下 BiMap 的使用方法。


BiMap 所支持的方法

V forcePut(K key, V value)

  • 方法介绍: 该方法用来强制执行 BiMap 所继承的 Map put() 方法. 也就是说如果 map 中有
    “a-key”->”a-value” 的话,在执行 biMap.forcePut(“a-key”,”a-value2”) “a-value2” 会强制取代 “a-value” 的位置

BiMap inverse

  • 方法介绍: 该方法会将当前的 转换成

V put(K key , V value)

  • 方法介绍: 该方法用来向数据结构中放入 key-value 键值对

    void putAll(Map<? extends K, ? extends V> map )

  • 该方法用来将 Map 类型的一次性全部放入到当前 BiMap 中,不过值得注意的是 K1, V1 必须要是 K,V 类型或使其子类

    Set values()

  • 该方法用以集合的方式来获得 BiMap 的值集合

  • 下面通过一个例子来介绍一下如何使用 BiMap,通过一个 Seq 类型的字符串 List 生成 key-value 对字典,
  • 然后将字典进行反转操作,将原来的 k-v 编程 v-k 映射map
object MatchPatternTester extends App{

    // 将传入的 Seqp[String] 通过 zipWithIndex.toMap 的方式
    // 转换成 Map 类型,然后通过调用 ImmutableBiMap 中的 putAll 方法
    // 将其传入到 ImmutableBiMap 中,然后调用它的 build 方法生成 BiMap 

    def getMapFromSeq(dict: Seq[String]): Unit ={
        val kTv = ImmutableBiMap.builder[String,Int]()
              .putAll(dict.zipWithIndex.toMap[String,Int])
              .build()

    // 获取 BiMap 的 key 集合
    val values = kTv.keySet()

    // 通过获取的 key 集合遍历 BiMap 中的每个 key-value 元素对
    values.foreach( (x: String ) => println("key " + x +" value "+ kTv(x)))

    // 调用 BiMap 的 inverse 方法来将 BiMap 转换成 BiMap    
    val inverseMap = kTv.inverse()

    // 获取反转之后的 key 集合
    val values2 = inverseMap.keySet()
    // 在获取 key 集合之后遍历反转之后的 BiMap 
    values2.foreach((k: Int ) => println("key " +k + " value "+ inverseMap(k)))

  }

  // 创建传入参数(Seq[String])
  val listInput = List[String]("aimer","aimer","kylin","kokia","rurutia","kylin")

  getMapFromSeq(listInput)

}