Java集合进阶(三)

news2024/12/23 11:28:32

文章目录

    • 一、Map
      • 1. 概述
      • 2. 基本功能
      • 3. 遍历
      • 4. 遍历学生对象
      • 5. 集合嵌套
      • 6. 统计字符出现次数
    • 二、Collections
      • 1. 常用方法
      • 2. 学生对象排序
    • 三、模拟斗地主

一、Map

1. 概述

Interface Map<K, V>:K 是键的类型,V 是值的类型。
将键映射到值的对象,不能包含重复的键,每个键可以映射到最多一个值。
举例:学生的学号和姓名,学号是键,姓名是值。
tyut001 刘德华
tyut002 张学友
tyut003 成吉思汗

创建 Map 集合的对象:
采用多态的方式,具体的实现类是 HashMap。

//Test.java

package com.zxe;

import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("tyut001", "刘德华");
        map.put("tyut002", "张学友");
        map.put("tyut003", "成吉思汗");
        map.put("tyut003", "程咬金");
        System.out.println(map);
    }
}

在这里插入图片描述

利用 HashMap 保证了元素的唯一性,键是唯一的,当出现重复的键时,后者会把前者的值替换掉!

2. 基本功能

在这里插入图片描述
在这里插入图片描述

//打印输出键值对中所有的值

package com.zxe;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("tyut001", "刘德华");
        map.put("tyut002", "张学友");
        map.put("tyut003", "成吉思汗");
        Collection<String> values = map.values();
        for (String s : values) {
            System.out.println(s);
        }
    }
}

在这里插入图片描述

3. 遍历

(1)方式一

遍历思路:
① 先获取所有键的集合,用 keySet() 方法实现;
② 然后遍历键的集合,获取到每一个键,用增强 for 实现;
③ 根据键全找值,用 get(Object key) 方法实现。

package com.zxe;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("tyut001", "刘德华");
        map.put("tyut002", "张学友");
        map.put("tyut003", "成吉思汗");
        Set<String> key = map.keySet();
        for (String k : key) {
            String value = map.get(k);
            System.out.println(k + ", " + value);
        }
    }
}

在这里插入图片描述

(2)方式二

遍历思路:
① 直接获取所有键值对对象的集合,用 entrySet() 方法实现,集合为 Set 型,每一个键值对对象用 Map.Entry<String, String> 接收;
② 遍历键值对对象的集合,得到每一个键值对对象,用增强 for 实现,得到每一个 Map.Entry;
③ 根据键值对对象获取键和值,用 getKey() 得到键,用 getValue() 得到值。

package com.zxe;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("tyut001", "刘德华");
        map.put("tyut002", "张学友");
        map.put("tyut003", "成吉思汗");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + ", " + value);
        }
    }
}

4. 遍历学生对象

需求:创建一个 HashMap 集合,键是学号(String),值是学生对象(Student),存储三个键值对元素,并遍历。

思路:
① 定义学生类;
② 创建 HashMap 集合对象;
③ 创建学生对象;
④ 把学生添加到集合;
⑤ 遍历集合。

//Student.java

package com.zxe;

public class Student {
    private String name;
    private int age;
    private String sex;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    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;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

//Test.java

package com.zxe;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华", 60, "男");
        Student s2 = new Student("张学娥", 21, "女");
        Student s3 = new Student("李华", 14, "男");
        String sno1 = "001";
        String sno2 = "002";
        String sno3 = "003";

        HashMap<String, Student> allstudent = new HashMap<>();
        allstudent.put(sno1, s1);
        allstudent.put(sno2, s2);
        allstudent.put(sno3, s3);

        Set<Map.Entry<String, Student>> entries = allstudent.entrySet();
        for (Map.Entry<String, Student> entry : entries) {
            String key = entry.getKey();
            Student value = entry.getValue();
            System.out.println(key + ", " + value);
        }
    }
}

在这里插入图片描述

思考一下,如果我们的键是用户定义的学生对象,值是居住地址,这时候如何保证学生对象成员变量的值不重复的呢?
在学生类中重写两个方法,hashCode() 和 equals(),这两个方法在之前的内容中有讲过,Alt + Insert 快捷键自动生成。

以学生对象 s1 和 s2 为例,HashMap 保证的唯一性是指,该集合中不允许添加两个或更多的 s1,但可以添加一个 s1 和一个 s2,即使 s1 和 s2 中的内容一模一样,但它并不在意二者内容如何;而重写 hashCode() 和 equals() 方法保证的唯一性是指,它不允许两个对象中出现完全相同的内容。所以要想保证真正意义上的唯一性,应同时使用 HashMap 和 hashCode()、equals() 方法!

5. 集合嵌套

//Test.java

package com.zxe;

import java.util.*;

public class Test {
    public static void main(String[] args) {
        HashMap<Integer, String> hm1 = new HashMap<>();
        hm1.put(1, "孙策");
        hm1.put(2, "大桥");
        HashMap<Integer, String> hm2 = new HashMap<>();
        hm2.put(3, "吕布");
        hm2.put(4, "貂蝉");
        ArrayList<HashMap<Integer, String>> a = new ArrayList<>();
        a.add(hm1);
        a.add(hm2);
        System.out.println(a);
    }
}

在这里插入图片描述

直接输出,或者也可以用遍历的方式输出:

//方法一
for (HashMap<Integer, String> hm : a) {
            Set<Map.Entry<Integer, String>> entries = hm.entrySet();
            for (Map.Entry<Integer, String> entry : entries) {
                System.out.println(entry.getKey() + ", " + entry.getValue());
            }
        }

//方法二
for (HashMap<Integer, String> hm : a) {
            Set<Integer> keys = hm.keySet();
            for (Integer key : keys) {
                String value = hm.get(key);
                System.out.println(key + ", " +value);
            }
        }
        

在这里插入图片描述

6. 统计字符出现次数

需求:键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。

思路:
① 键盘录入一个字符串;
② 创建 HashMap 集合,键是 Character,值是 Integer;
③ 遍历字符串,得到每一个字符;
④ 拿得到的每一个字符作为键到 HashMap 集合中去找对应的值,看其返回值,返回值为 null 说明该字符在 HashMap 集合中不存在,就把该字符作为键,1 作为值存储,如果返回值不是 null 说明该字符在 HashMap 集合中存在,把该键所对应的值加 1,然后重新存储该键值对;
⑤ 遍历 HashMap 集合,得到键和值,按照要求进行拼接。

//Test.java

package com.zxe;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String str = sc.nextLine();
        HashMap<Character, Integer> hm = new HashMap<>();
        for (int i = 0; i < str.length(); i++) {
            Character c = str.charAt(i);
            if (hm.containsKey(c)) {
                Integer newValue = hm.get(c) + 1;
                hm.put(c, newValue);
            } else {
                hm.put(c, 1);
            }
        }
        Set<Map.Entry<Character, Integer>> entries = hm.entrySet();
        for (Map.Entry<Character, Integer> entry : entries) {
            Character letter = entry.getKey();
            Integer num = entry.getValue();
            System.out.println(letter + "出现了" + num +"次!");
        }
    }
}

在这里插入图片描述

二、Collections

1. 常用方法

Collections 是针对集合操作的工具类。

常用方法:
① sort(),将指定的列表按升序排序;
② reverse(),反转指定列表中元素的顺序;
③ shuffle(),使用默认的随机源随机排列指定的列表。

//Test.java

package com.zxe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(6);
        list.add(7);
        list.add(2);
        list.add(4);
        list.add(9);

        Collections.reverse(list);
        System.out.println("反转:" + list);

        Collections.sort(list);
        System.out.println("升序排序:" + list);

        Collections.shuffle(list);
        System.out.println("随机排序:" + list);
    }
}

在这里插入图片描述

这是升序排序的方法,如果想要降序排序,完全可以先对集合进行升序排序,然后再反转,就得到了降序集合。

2. 学生对象排序

需求:ArrayList 存储学生对象,使用 Collections 对 ArrayList 进行排序,要求按照年龄从大到小排序,年龄相同时,按照姓名的字母顺序排序。

//Test.java

package com.zxe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Test {
    public static void main(String[] args) {

        Student s1 = new Student("zhangliang", 17);
        Student s2 = new Student("lvbu", 23);
        Student s3 = new Student("jiangziya", 31);
        Student s4 = new Student("kuangtie", 23);
        Student s5 = new Student("sunce", 27);

        ArrayList<Student> stus = new ArrayList<>();
        stus.add(s1);
        stus.add(s2);
        stus.add(s3);
        stus.add(s4);
        stus.add(s5);

        Collections.sort(stus, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num = o1.getAge() - o2.getAge();
                int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
                return num2;
            }
        });
        
        for (Student s : stus) {
            System.out.println(s.getName() + ", " + s.getAge());
        }

    }
}

在这里插入图片描述

这里排序的时候 sort() 方法是需要传入两个参数的,第一个就是要排序的集合,第二个需要指定一个比较器,之前我们学过的两种排序方法,自然排序和比较器排序,自然排序需要在学生类里面实现一个接口,这边我们通过比较器的方式来实现排序。

三、模拟斗地主

需求:通过程序实现斗地主过程中的洗牌、发牌和看牌,要求对牌进行排序。

思路:
① 创建 HashMap,键是编号,值是牌;
② 创建 ArrayList,存储编号;
③ 创建花色数组和点数数组;
④ 从 0 开始往 HashMap 里面存储编号,并存储对应的牌,同时往 ArrayList 里面存储编号;
⑤ 洗牌(洗的是编号),用 Collections 的 shuffle() 方法实现;
⑥ 发牌(发的也是编号),为了保证编号是排序的,创建 TreeSet 集合接收;
⑦ 定义方法看牌,遍历 TreeSet 集合,获取编号,到 HashMap 集合去到对应的牌;
⑧ 调用看牌方法。

//Test.java

package com.zxe;

import java.util.*;

public class Test {
    public static void main(String[] args) {

        HashMap<Integer, String> pokers = new HashMap<>();
        ArrayList<Integer> indexs = new ArrayList<>();

        String[] colors = {"♥", "♠", "♦", "♣"};
        String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        String[] kings = {"大王", "小王"};

        Integer index = 0;

        for (String number : numbers) {
            for (String color : colors) {
                pokers.put(index, color + number);
                indexs.add(index);
                index++;
            }
        }
        for (String king : kings) {
            pokers.put(index, king);
            indexs.add(index);
            index++;
        }

        Collections.shuffle(indexs);

        TreeSet<Integer> indexsOfPlayer1 = new TreeSet<>();
        TreeSet<Integer> indexsOfPlayer2 = new TreeSet<>();
        TreeSet<Integer> indexsOfPlayer3 = new TreeSet<>();
        TreeSet<Integer> indexsRetains = new TreeSet<>();

        for (int i = 0; i < indexs.size(); i++) {
            Integer in = indexs.get(i);
            if (i >= indexs.size() - 3) {
                indexsRetains.add(in);
            } else {
                switch (i % 3) {
                    case 0:
                        indexsOfPlayer1.add(in);
                        break;
                    case 1:
                        indexsOfPlayer2.add(in);
                        break;
                    default:
                        indexsOfPlayer3.add(in);
                        break;
                }
            }
        }

        showPokers("刘德华", indexsOfPlayer1, pokers);
        showPokers("张学友", indexsOfPlayer2, pokers);
        showPokers("程咬金", indexsOfPlayer3, pokers);

        System.out.println("\n底牌是:");
        for (Integer i : indexsRetains) {
            String retain = pokers.get(i);
            System.out.print(retain + " ");
        }

    }
    public static void showPokers(String name, TreeSet<Integer> indexsOfPlayer, HashMap<Integer, String> pokers) {
        System.out.println("\n" + name + "的牌:");
        for (Integer i : indexsOfPlayer) {
            String poker = pokers.get(i);
            System.out.print(poker + "  ");
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis高频面试题汇总(下)

目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey&#xff1f; 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染&#xff08;或满了…

20230311英语学习

Philosophy of Food: Guidelines for an Authentic Approach to Eating 饮食哲学&#xff1a;值得思考的问题 Whats Philosophical About Food? Philosophy of food finds its basis on the idea that food is a mirror.Eating mirrors the making of a self, that is, the …

vue3.js的介绍

一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架&#xff0c;尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本&#xff0c;在2016年9月30日发布了2.0Ghost in the Shell版本&#xff0c;目前项目由官方负责 vue的核心只关注图层&#xff0…

BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding

参考BERT原文[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (arxiv.org)【(强推)李宏毅2021/2022春机器学习课程】 https://www.bilibili.com/video/BV1Wv411h7kN/?p73&share_sourcecopy_web&vd_source30e93e9c70e…

CNN神经网络——手写体识别

目录 Load The Datesets Defining,Training,Measuring CNN Algorithm Datasets GRAET HONOR TO SHARE MY KNOWLEDGE WITH YOU This paper is going to show how to use keras to relize a CNN model for digits classfication Load The Datesets The datasets files are …

便携式井用自动采样器主要有哪些功能特点?

如图此款井用采样器整机小巧&#xff0c;非常适合狭小领域使用&#xff0c;携带方便&#xff0c;采样精准&#xff0c;可以延伸放到井下进行工作。尤其适合&#xff1a;窨井、下水道、沟渠 等现场条件恶劣的工作场合。可帮助采样人员采取到具有代表性的水样从而进行检测 参数特…

笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据

如果笔记本固态盘数据丢失怎么办&#xff1f;笔记本固态盘怎么恢复数据&#xff1f;下面将为大家详细地介绍一下笔记本固态硬盘数据恢复的三种实用方法&#xff0c;希望对大家有所帮助。一、简单恢复方法笔记本固态硬盘数据删除以后&#xff0c;较为简单直接的恢复方法就是从回…

《C++代码分析》第三回:类成员函数覆盖父类函数的调用(分析this指针的变化)

一、前言 在C的学习中我们知道&#xff0c;子类是可以覆盖父类的方法&#xff0c;这里我们探讨一下子类方法调用父类方法时this指针时如何变化的。 二、示例代码 #include "windows.h" #include "windef.h" #include <iostream> #include <tch…

自学大数据第六天~HDFS命令

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…

蓝桥杯嵌入式(G4系列):定时器输出可调PWM

前言&#xff1a; 蓝桥杯定时器输出PWM的考点在历届真题中的出现次数较多&#xff0c;而且之前关于STM32的学习&#xff0c;我对于使用STM32Cubemx配置PWM的方式确实不是很熟悉&#xff0c;这里简单记录一下自己的学习过程。 STM32Cubemx配置部分&#xff1a; 这里我们是改编真…

yocto编译烧录和脚本解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、初始化构建目录二、imx-setup-release.sh脚本解析三、编译单独编译内核四、烧录总结前言 本篇文章主要讲解如何在下载好源码之后进行编译和yocto的脚本解析…

剑指 Offer II 027. 回文链表

题目链接 剑指 Offer II 027. 回文链表 easy 题目描述 给定一个链表的 头节点 head&#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 示例 1&#xff1a; 输入: head [1,2,3,3,2,1] 输出: true 示例…

多目标遗传算法NSGA-II原理详解及算法实现

在接触学习多目标优化的问题上&#xff0c;经常会被提及到多目标遗传算法NSGA-II&#xff0c;网上也看到了很多人对该算法的总结&#xff0c;但真正讲解明白的以及配套用算法实现的文章很少&#xff0c;这里也对该算法进行一次详解与总结。会有侧重点的阐述&#xff0c;不会针对…

理解并解决【跨域】问题--通过代理或【CROS】

文章目录一.理解跨域问题引起跨域问题的原因浏览器的同源策略二.跨域问题的解决办法解决方法1-------代理&#xff08;前端配置&#xff09;解决方法2-----开启跨域资源共享CORS&#xff08;后端&#xff09;知识小贴士一.理解跨域问题 主要出现在前后端分离项目 引起跨域问题…

磨金石教育摄影技能干货分享|春之旅拍

春天来一次短暂的旅行&#xff0c;你会选择哪里呢&#xff1f;春天的照片又该如何拍呢&#xff1f;看看下面的照片&#xff0c;或许能给你答案。照片的构图很巧妙&#xff0c;画面被分成两部分&#xff0c;一半湖泊&#xff0c;一半绿色树林。分开这些的是一条斜向的公路&#…

合并两个链表(自定义位置合并与有序合并)LeetCode--OJ题详解

图片: csdn 自定义位置合并 问题&#xff1a; 给两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中 下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点 的位置。 比如&#xff1a; 输入&#xff1a;list1 [1…

【STL】list剖析及模拟实现

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 初识list 1. list基本概况 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立…

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能&#xff0c;但代码量大&#xff0c;难度大&#xff0c;需要掌握很多底层知识和数学知识 Threej…

卷积神经网络模型之——LeNet

目录LeNet模型参数介绍该网络特点关于C3与S2之间的连接关于最后的输出层子采样参考LeNet LeNet是一个用来识别手写数字的最经典的卷积神经网络&#xff0c;是Yann LeCun在1998年设计并提出的。Lenet的网络结构规模较小&#xff0c;但包含了卷积层、池化层、全连接层&#xff0…

Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab

冒泡APP&#xff08;升级版&#xff09;之基于Docker部署Gitlab基于Docker安装Gitlab登录Gitlab创建Git项目上传代码使用Git命令切换Git地址使用IDE更换Git地址基于Docker安装Gitlab 查看beginor/gitlab-ce镜像版本 下载指定版本的镜像 docker pull beginor/gitlab-ce:11.3.0…