map可以存放重复数据么,java复制一个map
目录
如何在地图中存放重复按键1。概述2.将集合作为价值3。使用Apache Commons集合4。番石榴。自定义多地图出现重复钥匙值叠加到上一个键中
如何在Map中存放重复key
1.概述
本文介绍几种处理地图中一个键对多个价值的方法。在爪哇岛开发工具包标准地图实现中当我们尝试在一个键下插入多个值,那么后续的价值会覆盖前面的价值.
MapString,String map=new HashMap();assertThat(map.put(key1 , value1 )).isEqualTo(null);assertThat(map.put(key1 , value2 )).等于(“值1”);assertThat(map.get(key1 )).等于(“值2”);
2.将集合作为Value
当要处理一个键对多个价值的情况,可以将所有价值存放在一个集合中。
MapString,list string map=new HashMap();ListString list=new ArrayList();map.put(key1 ,list);map.get(key1 ).add("值1 ");map.get(key1 ).add("值2 ");assertThat(map.get(key1 ).get(0)).等于(“值1”);assertThat(map.get(key1 ).get(1)).等于(“值2”);这种方式处理有多种缺点并且容易产生错误。我们需要为每个键创建一个集合,同时检查集合是否存在并添加或删除值,在Java 8中可以利用计算()方法来简化代码。
MapString,list string map=new HashMap();地图。computeifake( key 1 ,k - new ArrayList()).add("值1 ");地图。computeifake( key 1 ,k - new ArrayList()).add("值2 ");assertThat(map.get(key1 ).get(0)).等于(“值1”);assertThat(map.get(key1 ).get(1)).等于(“值2”);
3.使用Apache Commons Collections
添加依赖
相关性groupId组织。阿帕奇。commons/groupId artifact id commons-collections 4/artifact id版本4.1/version/相关性3.1 MutiMap
org。阿帕奇。公地。收藏4。多地图接口定义了一个地图,每个键对应一个集合。
MultiMapString,String map=new MultiValueMap();map.put(key1 , value 1 );map.put(key1 , value 2 );断言((集合字符串)映射。get( key 1 ).包含(值1 ,值2 );这个类非线程安全,4.1版本中已经废弃。
3.2 MultiValuedMap
org。阿帕奇。公地。收藏4。多值地图这个接口有多种实现,如ArrayListValuedHashMap与HashSetValuedHashMap。
使用方式如下:
lass="brush:java;">MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();map.put("key1", "value1");map.put("key1", "value2");map.put("key1", "value2");assertThat((Collection<String>) map.get("key1")) .containsExactly("value1", "value2", "value2");MultiValuedMap<String, String> map = new HashSetValuedHashMap<>();map.put("key1", "value1");map.put("key1", "value1");assertThat((Collection<String>) map.get("key1")) .containsExactly("value1");若不希望value重复那么可以使用HashSetValuedHashMap
MultiValuedMap<String, String> map = new HashSetValuedHashMap<>();map.put("key1", "value1");map.put("key1", "value1");assertThat((Collection<String>) map.get("key1")) .containsExactly("value1");
但ArrayListValuedHashMap,HashSetValuedHashMap及HashSetValuedHashMap都不是线程安全的。为了线程安全可以使用UnmodifiableMultiValuedMap。
@Test(expected = UnsupportedOperationException.class)public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() { MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>(); map.put("key1", "value1"); map.put("key1", "value2"); MultiValuedMap<String, String> immutableMap = MultiMapUtils.unmodifiableMultiValuedMap(map); immutableMap.put("key1", "value3");}
4.Guava Multimap
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version></dependency>
4.1 LinkedHashMultimap
这个类按插入顺序存放插入元素
Multimap<String, String> map = LinkedHashMultimap.create();map.put("key1", "value3");map.put("key1", "value1");map.put("key1", "value2");assertThat((Collection<String>) map.get("key1")) .containsExactly("value3", "value1", "value2");
4.2 TreeMultimap
这个类按可以按自然序访问插入的元素
Multimap<String, String> map = TreeMultimap.create();map.put("key1", "value3");map.put("key1", "value1");map.put("key1", "value2");assertThat((Collection<String>) map.get("key1")) .containsExactly("value1", "value2", "value3");
5.自定义MultiMap
如果使用Guava,那么还可以使用Multimap.newMultimap()来定制我们的Map。
小结:一对多思路就是通过集合来存储元素,guava和apache collection为我们提供了现成的工具,如果想自定义还可以使用guava提供的扩展方法来实现。
Map出现重复Key值叠加到上一个key中
Map出现重复Key值将下一个key值叠加在上一个key值中
List<Map<String, Object>> list = new ArrayList<>(); //模拟数据库数据 for (int i = 0; i < 10; i++) { Map<String, Object> map = new HashMap<>(); map.put("id", i); map.put("name", "张三" + i); if (i < 10 - 1) { map.put("pid", 2); } else { map.put("pid", 3); } list.add(map); } //运用map中的containsKey方法 Map<String, Object> map1 = new HashMap<>(); for (Map map2 : list) { List<Object> list1 = new ArrayList<>(); String pid = map2.get("pid") + ""; //如果是重复的那么就进行叠加操作 if (map1.containsKey(pid)) { list1 = (List<Object>) map1.get(pid); } list1.add(map2); map1.put(map2.get("pid") + "", list1); } System.out.println(map1); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。