双向Map:TreeBidiMap —— 实现key和value的互相读取

新接口被添加到支持双向映射。 使用双向映射,可以使用值查找键,并且可以使用键轻松查找值。

接口声明

以下是org.apache.commons.collections4.BidiMap <K,V>接口的声明 -

public interface BidiMap<K,V>
   extends IterableMap<K,V>

以下是接口的方法列表 -

编号方法描述
1K getKey(Object value)获取当前映射到指定值的键。
2BidiMap<V,K> inverseBidiMap()获取该映射的键和值的键视图。
3V put(K key, V value)将键值对放入映射中,替换之前的任何一对。
4K removeValue(Object value)删除当前映射到指定值的键值对(可选操作)。
5Set<V> values()返回此映射中包含的值的Set视图。

方法继承

该接口继承了以下接口的方法 -

  • org.apache.commons.collections4.Get
  • org.apache.commons.collections4.IterableGet
  • org.apache.commons.collections4.Put
  • java.util.Map

BidiMap接口实例

案例1:

知识点:BidiMap 的key和value都必须是唯一的,相同的key或者value,后添加的覆盖先添加的

package com.example.demo7;

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;

public class BidiMapTester {

   public static void main(String[] args) {

      BidiMap<String, String> bidi = new TreeBidiMap<>();
      bidi.put("One", "1");
      bidi.put("Two", "1");
      bidi.put("Three", "3");
      bidi.put("Three", "4");
      System.out.println("Map: " + bidi);
   }
}

控制台结果

Map: {Three=4, Two=1}

讨论:

我们在map中添加了四个元素,第一个和第二个的value相同,key不同;第三个和第四个的key相同,value不同。结果在map中只添加成功了第二个元素和第四个元素,第一个和第三个都被覆盖了。

说明 BidiMap 的key和value都必须是唯一的,相同的key或者value,后添加的覆盖先添加的。

案例2:

知识点:BidiMap 可以通过key获取value,也可以通过value获取key, 可以通过key删除数据,也可以通过value删除数据。

package com.example.demo7;

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;

public class BidiMapTester {

   public static void main(String[] args) {

      BidiMap<String, String> bidi = new TreeBidiMap<>();
      bidi.put("One", "1");
      bidi.put("Two", "2");
      bidi.put("Three", "3");
      bidi.put("Four", "4");

      System.out.println("根据key获取value: " + bidi.get("One"));
      System.out.println("根据value获取key: " + bidi.getKey("1"));
      System.out.println("原始的Map: " + bidi);

      bidi.remove("One");
      System.out.println("根据key删除数据后的Map: " + bidi);
      bidi.removeValue("2");
      System.out.println("根据value删除数据后的Map: " + bidi);

      BidiMap<String, String> inversedMap = bidi.inverseBidiMap();
      System.out.println("键值对Map: " + inversedMap);
   }
}

控制台结果

根据key获取value: 1
根据value获取key: One
原始的Map: {Four=4, One=1, Three=3, Two=2}
根据key删除数据后的Map: {Four=4, Three=3, Two=2}
根据value删除数据后的Map: {Four=4, Three=3}
键值对Map: {3=Three, 4=Four}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想对存放 `std::string = Json::Value` 类型的文本文件进行数据拆分,可以按照以下步骤实现: 1. 读取文件数据到内存中,可以使用 `std::ifstream` 类读取文件数据到 `std::string` 中。 ```cpp std::ifstream file("data.json"); std::string file_data((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); ``` 2. 将文件数据转换为 `Json::Value`,可以使用 `Json::Reader` 类将 `std::string` 转换为 `Json::Value`。 ```cpp Json::Value root; Json::Reader reader; if (!reader.parse(file_data, root)) { // 解析失败 } ``` 3. 对 `Json::Value` 进行数据拆分,可以使用循环遍历 `Json::Value` 中的每个成员,并将其存入 `std::map<std::string,Json::Value>` 类型的 `map` 数据中。 ```cpp int split_size = 100; // 拆分大小 int total_size = root.size(); std::map<std::string, Json::Value> data_map; for (int i = 0; i < total_size; i += split_size) { Json::Value split_data; for (int j = i; j < i + split_size && j < total_size; j++) { // 从 root 中取出数据拆分 std::string key = root.getMemberNames()[j]; Json::Value value = root[root.getMemberNames()[j]]; split_data[key] = value; } // 将拆分后的数据存入 map 中 std::string map_key = "split_" + std::to_string(i); data_map[map_key] = split_data; } ``` 上述代码将 `Json::Value` 按照 `split_size` 的大小进行拆分,并将拆分后的数据存入 `std::map<std::string,Json::Value>` 类型的 `map` 数据中。其中 `Json::Value::getMemberNames` 函数可以获取 `Json::Value` 中的所有成员名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值