最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何在Map中存放重復(fù)key

 更新時(shí)間:2022年05月06日 09:43:17   作者:FserSuN  
這篇文章主要介紹了Java如何在Map中存放重復(fù)key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何在Map中存放重復(fù)key

1.概述

本文介紹幾種處理Map中一個(gè)key對(duì)多個(gè)value的方法。在JDK標(biāo)準(zhǔn)Map實(shí)現(xiàn)中當(dāng)我們嘗試在一個(gè)key下插入多個(gè)value,那么后續(xù)的value會(huì)覆蓋前面的value。

Map<String, String> map = new HashMap<>();
assertThat(map.put("key1", "value1")).isEqualTo(null);
assertThat(map.put("key1", "value2")).isEqualTo("value1");
assertThat(map.get("key1")).isEqualTo("value2");

2.將集合作為Value

當(dāng)要處理一個(gè)key對(duì)多個(gè)value的情況,可以將所有value存放在一個(gè)集合中。

Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
map.put("key1", list);
map.get("key1").add("value1");
map.get("key1").add("value2");
??
assertThat(map.get("key1").get(0)).isEqualTo("value1");
assertThat(map.get("key1").get(1)).isEqualTo("value2");

這種方式處理有多種缺點(diǎn)并且容易產(chǎn)生錯(cuò)誤。我們需要為每個(gè)key創(chuàng)建一個(gè)集合,同時(shí)檢查集合是否存在并添加或刪除值,在Java 8中可以利用compute()方法來(lái)簡(jiǎn)化代碼。

Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value1");
map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value2");
?
assertThat(map.get("key1").get(0)).isEqualTo("value1");
assertThat(map.get("key1").get(1)).isEqualTo("value2");

3.使用Apache Commons Collections

添加依賴

<dependency>
? <groupId>org.apache.commons</groupId>
? <artifactId>commons-collections4</artifactId>
? <version>4.1</version>
</dependency>

3.1 MutiMap

org.apache.commons.collections4.MultiMap接口定義了一個(gè)Map,每個(gè)key對(duì)應(yīng)一個(gè)集合。

MultiMap<String, String> map = new MultiValueMap<>();
map.put("key1", "value1");
map.put("key1", "value2");
assertThat((Collection<String>) map.get("key1"))
? .contains("value1", "value2");

這個(gè)類非線程安全,4.1版本中已經(jīng)廢棄。

3.2 MultiValuedMap

org.apache.commons.collections4.MultiValuedMap這個(gè)接口有多種實(shí)現(xiàn),如ArrayListValuedHashMap與HashSetValuedHashMap。

使用方式如下:

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重復(fù)那么可以使用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

這個(gè)類按插入順序存放插入元素

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

這個(gè)類按可以按自然序訪問(wèn)插入的元素

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()來(lái)定制我們的Map。

小結(jié):一對(duì)多思路就是通過(guò)集合來(lái)存儲(chǔ)元素,guava和apache collection為我們提供了現(xiàn)成的工具,如果想自定義還可以使用guava提供的擴(kuò)展方法來(lái)實(shí)現(xiàn)。

Map出現(xiàn)重復(fù)Key值疊加到上一個(gè)key中

Map出現(xiàn)重復(fù)Key值將下一個(gè)key值疊加在上一個(gè)key值中

   List<Map<String, Object>> list = new ArrayList<>();
        //模擬數(shù)據(jù)庫(kù)數(shù)據(jù)
        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);
        }
        //運(yùn)用map中的containsKey方法
        Map<String, Object> map1 = new HashMap<>();
        for (Map map2 : list) {
            List<Object> list1 = new ArrayList<>();
            String pid = map2.get("pid") + "";
            //如果是重復(fù)的那么就進(jìn)行疊加操作
            if (map1.containsKey(pid)) {
                list1 = (List<Object>) map1.get(pid);
            } 
            list1.add(map2);
            map1.put(map2.get("pid") + "", list1);
        }
        System.out.println(map1);        
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 深入理解DevOps+微服務(wù)框架

    深入理解DevOps+微服務(wù)框架

    這篇文章主要介紹了深入理解DevOps+微服務(wù),主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平臺(tái)(Platform)的知識(shí)講解,需要的朋友可以參考下
    2022-05-05
  • java根據(jù)擴(kuò)展名獲取系統(tǒng)圖標(biāo)和文件圖標(biāo)示例

    java根據(jù)擴(kuò)展名獲取系統(tǒng)圖標(biāo)和文件圖標(biāo)示例

    這篇文章主要介紹了java根據(jù)擴(kuò)展名獲取系統(tǒng)圖標(biāo)和文件圖標(biāo)示例,需要的朋友可以參考下
    2014-03-03
  • Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲

    Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲

    這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java如何通過(guò)IP解析地理位置

    java如何通過(guò)IP解析地理位置

    這篇文章主要介紹了java如何通過(guò)IP解析地理位置的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Nacos?Discovery服務(wù)治理解決方案

    Nacos?Discovery服務(wù)治理解決方案

    DiscoveryClient是專門(mén)負(fù)責(zé)服務(wù)注冊(cè)和發(fā)現(xiàn)的,我們可以通過(guò)它獲取到注冊(cè)到注冊(cè)中心的所有服務(wù),這篇文章主要介紹了Nacos?Discovery服務(wù)治理,需要的朋友可以參考下
    2022-11-11
  • JAVA代碼實(shí)現(xiàn)MongoDB動(dòng)態(tài)條件之分頁(yè)查詢

    JAVA代碼實(shí)現(xiàn)MongoDB動(dòng)態(tài)條件之分頁(yè)查詢

    這篇文章主要介紹了JAVA如何實(shí)現(xiàn)MongoDB動(dòng)態(tài)條件之分頁(yè)查詢,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python實(shí)現(xiàn)filter函數(shù)實(shí)現(xiàn)字符串切分

    Python實(shí)現(xiàn)filter函數(shù)實(shí)現(xiàn)字符串切分

    這篇文章主要介紹了Python實(shí)現(xiàn)filter函數(shù)實(shí)現(xiàn)字符串切分,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java8 Comparator源碼演示及解析

    Java8 Comparator源碼演示及解析

    這篇文章主要介紹了Java8 Comparator源碼演示及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥(niǎo)游戲

    只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥(niǎo)游戲

    今天給大家?guī)?lái)的是關(guān)于Java實(shí)戰(zhàn)的相關(guān)知識(shí),文章圍繞著只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥(niǎo)游戲展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java單例模式和多例模式實(shí)例分析

    Java單例模式和多例模式實(shí)例分析

    這篇文章主要介紹了Java單例模式和多例模式,結(jié)合實(shí)例形式分析了java單例模式與多例模式的定義及使用技巧,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

拜泉县| 绥江县| 南京市| 万州区| 宝鸡市| 遵化市| 临夏县| 和田市| 灵山县| 界首市| 建昌县| 南丰县| 松潘县| 沁阳市| 丰镇市| 山东省| 达州市| 华宁县| 靖宇县| 吉林省| 拜泉县| 丰镇市| 岢岚县| 民权县| 恩施市| 诸暨市| 德州市| 绵阳市| 松滋市| 琼结县| 循化| 新巴尔虎右旗| 新丰县| 六枝特区| 承德市| 吴忠市| 曲沃县| 盐津县| 云霄县| 准格尔旗| 慈利县|