Map集合的遍歷方式以及TreeMap集合保存自定義對象實現比較的Comparable和Comparator兩種方式

来源:https://www.cnblogs.com/sx-jd/archive/2018/11/13/9950096.html
-Advertisement-
Play Games

Map集合的特點 1、Map集合中保存的都是鍵值對,鍵和值是一一對應的 2、一個映射不能包含重覆的值 3、每個鍵最多只能映射到一個值上 Map介面和Collection介面的不同 Map是雙列集合的根介面,Collection是單列集合的根介面 1、Map是雙列的(是雙列集合的根介面),Collec ...


Map集合的特點

1、Map集合中保存的都是鍵值對,鍵和值是一一對應的

2、一個映射不能包含重覆的值

3、每個鍵最多只能映射到一個值上

 

Map介面和Collection介面的不同

Map是雙列集合的根介面,Collection是單列集合的根介面

1、Map是雙列的(是雙列集合的根介面),Collection是單列的(是單列集合的根介面)

2、Map的鍵是唯一的,Collection的子介面Set是唯一的

3、Map集合的數據結構值針對鍵有效,跟值無關;如:TreeMap:鍵是用二叉樹演算法,HashMap:鍵是hash演算法, Collection集合的數據結構是針對元素有效

 

Map集合的遍歷方式

 

package com.jd.text;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo06 {

    public static void main(String[] args) {
        // 創建map集合
        Map map = new HashMap<>();
        // 添加 將指定的值與此映射中的指定鍵關聯
        map.put("張三", 12);
        map.put("李四", 13);
        map.put("蔡文姬", 14);
        map.put("王五", 15);
        // 刪除 如果存在一個鍵的映射關係,則將其從此映射中移除
        map.remove("王五");
        // map.clear();//刪除全部 從此映射中移除所有映射關係
        // 根據指定的key獲取對應的value
        Object obj1 = map.get("張三");
        System.out.println(obj1);
        // 是否包含指定的key,包含返回true,不包含返回false。
        boolean b = map.containsKey("張三");
        System.out.println(b);
        // 是否包含指定的value,包含返回true,不包含返回false。
        boolean c = map.containsValue(13);
        System.out.println(c);
        
        System.out.println("******************************");
        
        // map集合的遍歷,通過keyset()方法(迭代器)
        Set keySet = map.keySet();
        Iterator iter = keySet.iterator();
        while (iter.hasNext()) {
            Object key = iter.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
        System.out.println("******************************");
        
        // map集合的遍歷,通過keyset()方法(foreach)
        Set keySet2 = map.keySet();
        for (Object key : keySet2) {
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
        System.out.println("******************************");
        
        // map集合的遍歷,通過entrySet()方法(foreach)
        Set entrySet = map.entrySet();
        for (Object obj3 : entrySet) {
            Entry e = (Entry) obj3;
            Object key = e.getKey();
            Object value = e.getValue();
            System.out.println(key + ":" + value);
        }
        System.out.println("******************************");
        
        // map集合的values方法,獲取到的map集合的value的值組成的collection集合
        Collection coll = map.values();
        for (Object obj : coll) {
            System.out.println(obj);
        }
    }
}

運行結果:

12
true
true
******************************
李四:13
張三:12
蔡文姬:14
******************************
李四:13
張三:12
蔡文姬:14
******************************
李四:13
張三:12
蔡文姬:14
******************************
13
12
14

 

TreeMap集合保存自定義對象

package com.jd.text;

import java.util.Set;
import java.util.TreeMap;

/*
* TreeMap保存自定義對象,比較的Comparable和Comparator兩種方式
* 1.通過實現Comparable介面,重寫compareTo()方法。
*/
public class Demo07 {

public static void main(String[] args) {
TreeMap map=new TreeMap<>();
map.put(new User("張三01", 12),11);
map.put(new User("張三01", 10),11);
map.put(new User("張三02", 13),11);
map.put(new User("張三01", 12),11);
//通過重寫hashCode()和equals(Object obj)方法防止重覆的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
}

 

package com.jd.text;
/*
 * 通過實現Comparable介面,重寫compareTo()方法。
 */
public class User implements Comparable{

    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public User() {
        super();
    }
    
    @Override
    public int hashCode() {
        final int prime=31;
        int result=1;
        result=prime*result+age;
        result=prime*result+((name==null)?0:name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if(this==obj)
            return true;
        if(obj==null)
            return false;
        if(getClass()!=obj.getClass())
            return false;
        User user=(User) obj;
        if(age!=user.age)
            return false;
        if(name==null){
            if(user.name!=null)
                return false;
        }else if(!name.equals(user.name))
            return false;
        return true;
    }
    @Override
    public int compareTo(Object o) {
        if(o instanceof User){
            User user=(User) o;
            int sum=name.compareTo(user.name);
            if(sum==0)
                return age-user.age;
            return sum;
        }
        throw new ClassCastException("不是User類型");
    }
    
}

運行結果:

User [name=張三01, age=10]:11
User [name=張三01, age=12]:11
User [name=張三02, age=13]:11

 

package com.jd.text;
/*
 * TreeMap保存自定義對象,比較的Comparable和Comparator兩種方式
 * 2.自己構造比較器實現Comparator介面,重寫compare(Object o1, Object o2)方法
 */

import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

public class Demo08 {

    public static void main(String[] args) {
        TreeMap map=new TreeMap(new MyCompare());
        map.put(new User2("張三01", 12),11);
        map.put(new User2("張三01", 10),11);
        map.put(new User2("張三02", 13),11);
        map.put(new User2("張三01", 12),11);
        //通過重寫hashCode()和equals(Object obj)方法防止重覆的值存入
        Set set = map.keySet();
        for (Object key : set) {
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
    }
}

class User2{
    String name;
    int age;
    
    public User2(String name,int age){
        this.name=name;
        this.age=age;
    }
    
    @Override
    public int hashCode(){
        final int prime=31;
        int result=1;
        result=prime*result+age;
        result=prime*result+((name==null)?0:name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj){
        if(this==obj)
            return true;
        if(obj==null)
            return false;
        if(getClass()!=obj.getClass())
            return false;
        User2 u=(User2) obj;
        if(age!=u.age)
            return false;
        if(name==null){
            if(u.name!=null)
                return false;
        }else if(!name.equals(u.name))
                return false;
        return true;
    }
    @Override
    public String toString() {
        return "User2 [name=" + name + ", age=" + age + "]";
    }
}
//比較器
class MyCompare implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        if(o1 instanceof User2 && o2 instanceof User2){
            User2 u1=(User2) o1;
            User2 u2=(User2) o2;
            int sum=u1.age-u2.age;
            if(sum==0){
                return u1.name.compareTo(u2.name);
            }
            return sum;
        }
        throw new ClassCastException("不是User2 類型");
    }
    
}

運行結果:

User2 [name=張三01, age=10]:11
User2 [name=張三01, age=12]:11
User2 [name=張三02, age=13]:11

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 'use strict' 2 3 function 找出最長公子串 (...strings) { 4 let arraiesOfSubStrings = [] 5 arrayOfStrings.reduce((accumulator, currentValue) => { 6 arraiesOf... ...
  • 大家在做http請求的時候可能會遇到跨域問題,這裡為大家提供解決方案,親自實驗有效。 一般是報上述錯誤。 首先在C盤新建一個文件夾,命名按照下麵的來。 打開谷歌瀏覽器的設置 在“目標” 的exe後面添加下麵這段內容,不要忘記打空格。並且下麵這段內容不要放在包含“exe”的雙引號裡面,放在外面 --d ...
  • 分頁介面的實現,在偏業務的服務端開發中應該很常見,PC時代的各種表格,移動時代的各種 流、 。 出於對流量的控制,或者用戶的體驗,大批量的數據都不會直接返回給客戶端,而是通過分頁介面,多次請求返回數據。 而最常用的分頁介面定義大概是這樣的: 介面傳入請求的頁碼、以及每頁要請求的條數,我個人猜想這可能 ...
  • InfoQ 上有推薦過這本書的。結合我們自己項目的經驗來看,這本書還是相當有可操作性,對於採用scrum不是很久的同學,特別是從傳統軟體開發模式轉過來的同學,相當有幫助 Scrum敏捷軟體開發》是敏捷聯盟及Scrum聯盟創始人之一、敏捷估算及計劃的鼻祖Mike Cohn三大經典著作中影響最為深厚的扛 ...
  • Spring 是什麼? Spring 是一個開源的輕量級 Java SE( Java 標準版本)/Java EE( Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程式開發。在傳統應用程式開發中,一個完整的應用是由一組相互協作的對象組成的。所以開發一個應用除了要開發業務邏輯之外,最多的是 ...
  • 撩課Java+系統架構 視頻 點擊開始學習 31.靜態變數和實例變數的區別? 靜態變數也叫類變數, 這種變數前加了static修飾符。 可以直接用類名調用, 也可以用對象調用, 而且所有對象的同一個類變數 都是共用同一塊記憶體空間。 實例變數也叫對象變數, 這種變數沒有加static修飾符。 只能通過... ...
  • #!/usr/bin/env python # -*- coding: utf-8 -*- name = input("Name:") age = input("Age:") job = input("Job:") hobbie = input("Hobbie:") info = ''' -----... ...
  • 技術棧 Servlet + Jsp + Tomcat , 是Java Web入門非常好的練手項目 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...