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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...