Java中的Map及其使用_java map_taraex的博客-程序员宝宝

技术标签: JAVA  

Map

Map集合概述和特点

概述:
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

Map集合的功能概述

a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数

Map集合的遍历之键找值

获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值

public class Test4 {
    public static void main(String[] args) {
        HashMap<Phone,String> map = new HashMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Phone> phones = map.keySet();
        Iterator<Phone> iterator = phones.iterator();
        while (iterator.hasNext()){
            Phone next = iterator.next();
            System.out.println(next.getBrand()+"=="+next.getPrice()+"=="+map.get(next));
        }

    }
}
class Phone{
    private String Brand;
    private int Price;

    public Phone(String brand, int price) {
        Brand = brand;
        Price = price;
    }

    public String getBrand() {
        return Brand;
    }

    public void setBrand(String brand) {
        Brand = brand;
    }

    public int getPrice() {
        return Price;
    }

    public void setPrice(int price) {
        Price = price;
    }
}

获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值

public class Test4 {
    public static void main(String[] args) {
        HashMap<Phone,String> map = new HashMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Map.Entry<Phone, String>> entries = map.entrySet();
        for (Map.Entry<Phone, String> entry : entries) {
            System.out.println(entry.getKey().getBrand()+"==="+entry.getKey().getPrice()+"==="+entry.getValue());
        }
    }
}

一般来说建议使用entrySet遍历方式,其效率高

LinkedHashMap的概述和使用

LinkedHashMap的概述: Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序LinkedHashMap的特点: 底层的数据结构是链表和哈希表 元素有序 并且唯一
元素的有序性由链表数据结构保证 唯一性由 哈希表数据结构保证
Map集合的数据结构只和键有关

TreeMap集合

TreeMap 键不允许插入null
TreeMap: 键的数据结构是红黑树,可保证键的排序和唯一性
排序分为自然排序和比较器排序
线程是不安全的效率比较高
TreeMap集合排序:
实现Comparable接口,重写CompareTo方法
使用比较器

TreeMap集合的遍历

public class Test4 {
    public static void main(String[] args) {
        TreeMap<Phone,String> map = new TreeMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Phone> phones = map.keySet();
        Iterator<Phone> iterator = phones.iterator();
        while(iterator.hasNext()){
            Phone next = iterator.next();
            System.out.println(next.getBrand()+"==="+next.getPrice()+"==="+map.get(next));
        }
    }
}
class Phone implements Comparable<Phone>{
    private String Brand;
    private int Price;

    public Phone(String brand, int price) {
        Brand = brand;
        Price = price;
    }

    public String getBrand() {
        return Brand;
    }

    public void setBrand(String brand) {
        Brand = brand;
    }

    public int getPrice() {
        return Price;
    }

    public void setPrice(int price) {
        Price = price;
    }

    @Override
    public int compareTo(Phone o) {
        return this.getPrice() - o.getPrice();
    }
}

集合嵌套之HashMap嵌套HashMap

基础班
张三 20
李四 22
就业班
王五 21
赵六 23

public class Test5 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("张三",20);
        map.put("李四",22);
        HashMap<String, Integer> map1 = new HashMap<>();
        map1.put("王五",21);
        map1.put("赵六",23);
        HashMap<String, HashMap<String, Integer>> mapmax = new HashMap<>();
        mapmax.put("基础班",map);
        mapmax.put("就业班",map1);
        Set<Map.Entry<String, HashMap<String, Integer>>> entries = mapmax.entrySet();
        for (Map.Entry<String, HashMap<String, Integer>> entry : entries) {
            System.out.println(entry.getKey());
            Set<Map.Entry<String, Integer>> entries1 = entry.getValue().entrySet();
            for (Map.Entry<String, Integer> stringIntegerEntry : entries1) {
                System.out.println("\t"+stringIntegerEntry.getKey()+"     "+stringIntegerEntry.getValue());
            }
        }
    }
}

Arraylist嵌套HashMap

public class Test3 {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("周瑜","小乔");
        map.put("吕布","貂蝉");
        HashMap<String, String> map1 = new HashMap<>();
        map1.put("郭靖","黄蓉");
        map1.put("杨过","小龙女");
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("令狐冲","任盈盈");
        map2.put("林平之","岳灵珊");
        ArrayList<HashMap<String, String>> list = new ArrayList<>();
        list.add(map);
        list.add(map1);
        list.add(map2);
        for (HashMap<String, String> s : list) {
            Set<String> strings = s.keySet();
            for (String s1 : strings) {
                String s2 = s.get(s1);
                System.out.println("\t"+s1+"---"+s2);

            }
            System.out.println();
        }
    }
}

Collections工具类的概述和常见方法

A:Collections类概述: 针对集合操作 的工具类
B:Collections成员方法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<?> list,T key): 二分查找
public static T max(Collection<?> coll): 获取最大值
public static void reverse(List<?> list): 反转
public static void shuffle(List<?> list): 随机置换

模拟斗地主洗牌和发牌并对牌进行排序的代码实现
在这里插入图片描述

public class Test4 {
    public static void main(String[] args) {
        //A:
        //案例演示:
        //模拟斗地主洗牌和发牌,牌没有排序
        //得有一副牌
        //生成54张牌放到牌盒里面
        String[] colors = {"", "", "", ""};
        String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        ArrayList<Integer> list = new ArrayList<>();
        int index = 0;
        for (String num : nums) {
            for (String color : colors) {
                map.put(index, color.concat(num));
                list.add(index);
                index++;
            }
        }

            map.put(index, "☆");
            list.add(index);
            index++;
            map.put(index, "★");
            list.add(index);


            //洗牌
            Collections.shuffle(list);

            //发牌
            TreeSet<Integer> 高进 = new TreeSet<>();
            TreeSet<Integer> 刀仔 = new TreeSet<>();
            TreeSet<Integer> 星仔 = new TreeSet<>();
            TreeSet<Integer> 底牌 = new TreeSet<>();
            // 高进 = (ArrayList<String>) pokerBox.subList(0,17);
            // 高进 0  3 6 9
            //刀仔 1 4 7 10
            //  星仔 2 5 8 11
            for (int i = 0; i < list.size(); i++) {
                if (i >= list.size() - 3) {
                    底牌.add(list.get(i));
                } else if (i % 3 == 0) {
                    高进.add(list.get(i));
                } else if (i % 3 == 1) {
                    刀仔.add(list.get(i));
                } else {
                    星仔.add(list.get(i));
                }
            }



            //看牌
            lookPoker(map,高进,"高进");
            lookPoker(map,刀仔,"刀仔");
            lookPoker(map,星仔,"星仔");
            lookPoker(map,底牌,"底牌");



    }

    public static void lookPoker(HashMap<Integer, String> map, TreeSet<Integer> list, String name) {
        System.out.println(name);
        for (Integer s : list) {
            System.out.print(map.get(s));
        }
        System.out.println();
    }
}

Map中的键唯一,但是当存储自定义对象时,需要重写Hashcode和equals方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/taraex/article/details/90243965

智能推荐

VB.NET Declare语句_declare sub name lib_chinaherolts2008的博客-程序员宝宝

本文是看了网上很多零碎的知识点总结而成,要感谢广大网友的智慧Declare语句用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。语法 1[Public | Private] Declare Sub name Lib “libname” [Alias “aliasname”] [([arglist])]语法 2[Public | Private] Declare Function name Lib “libname” [Alias “aliasname”] [([arglist])]

永磁同步电机电流滞环控制仿真_电机控制滞环电流控制建模_hfkdd的博客-程序员宝宝

滞环控制基本思想:检测输出的电流与给定电流比较,若实际电流与给定电流之差大于滞环上限,逆变器A相上桥臂开关器件关断,下桥臂开关器件导通,电动机接电压-ua,,电流下降,反之,上桥臂导通,下桥臂关断,电动机接电压+ua,电流上升。通过滞环比较器使得电流跟踪给定值,将电流限制在滞环范围之内。滞环模块:三相电流曲线:放大以后:可以看出电流波形呈现锯齿状,锯齿的高度就是滞环的范围。设置为0...

树和树林的实现,不懂数据结构的人也能看懂_数据结构树林_方林博士的博客-程序员宝宝

树常用来表达一对多的关系,比如企业里从总经理到部门到员工的关系,军队中从军、师、团到营、连、排、班的关系,XML文档中各种文档元素之间的组成关系等等都可以用树表示。下图4给出了树的一个示例:树的一个例子树由结点构成,有一个唯一的结点称为根,包括根在内每个结点可以有0个、1个或者多个子结点,子结点又可以有自己的子结点,依此类推,构成了一个树根在上的倒过来的树形结构。除了根之外,每个结点都有且仅有一个父结点。没有子结点的结点称为叶子。除了根和叶子之外,其他结点称为中间结点。树以及树所构成的集..

Win10下 Java环境变量配置_木头分享的博客-程序员宝宝

tnnowu博客停更,新的博客迁移到简书。http://www.jianshu.com/u/c219ab07dca0Windows 10 Java环境变量配置Win10下 Java环境变量配置首先,你应该已经安装了 Java 的 JDK 了(如果没有安装JDK,请跳转到此网址:http://www.oracle.com/technetwork/java/javase/downloa...

windows添加右键点击打开CMD(运行)的方法_联想小新 右键点个性化变到cmd命令_Wowitt的博客-程序员宝宝

(记录一下,这样操作的目的是方便再某个文件夹下直接打开运行cmd 解决了cd \的问题,而且对比发现,cmd 比gitBash或者编译器自带的shell或者Terminal 工具运行速度好很多。)法一:新建文件,将以下内容保存成reg文件,如addCMD.reg,双击该文件自动导入设置Windows Registry Editor Version 5.00[HKEY_CLASSES_RO...

C++STL之vector动态数组_KingOfMyHeart的博客-程序员宝宝

一、vector的简单使用以及耗时测试:#include&lt;iostream&gt;#include&lt;vector&gt;#include&lt;cstdlib&gt;//qsort bsearch NULL#include&lt;ctime&gt;using namespace std;const int SIZE = 100000;int main(){ vecto...

随便推点

LeetCode每日一题--714. 买卖股票的最佳时机含手续费(动态规划 贪心)_七七不是七七七七的博客-程序员宝宝

题目:跳转至 714. 买卖股票的最佳时机含手续费给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意: 这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出:

Linux LinkFile_linkfile的命令_FAR的博客-程序员宝宝

链接:一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(HardLink)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。我们首先来了解一下几个名词:索引节点(inode)     [ls -i show the inode of files ]要了解链接,我们首先得了解一个概念,叫索引节点(i

图文带你理解什么是Few-shot Learning_Pr4da的博客-程序员宝宝

Few-shot Learning(少样本学习)是Meta Learning(元学习)中的一个实例1,所以在了解什么是Few-shot Learning之前有必要对Meta Learning有一个简单的认识。不过在了解什么是Meta Learning之前还是要了解一下什么是Meta。因此,阅读本文后你将对如下知识有一个初步的了解。What is MetaWhat is Meta LearningWhat is Few-shot Learning1. What is Meta?meta就是描述

关于windows系统解决 npm WARN checkPermissions Missing write access 问题_async_lee的博客-程序员宝宝

之前碰到过一次这个问题困扰了蛮久,百度找到了原因和相关解决办法成功了,是由于没有管理权限,项目比较赶就没太在意。今天重新安装依赖的时候又碰上了这个问题,npm, cnpm 一顿操作硬是报错。知道了原因,于是信心满满右键CMD运行管理员权限运行 看橘势应该ok的,刚拿起82年的快乐水差点就吐出来。。。又是一波 npm WARN checkPermissions Missing...... 完蛋后来找...

echarts x轴文字显示不全(xAxis文字倾斜比较全面的3种做法值得推荐)_xaxis字体显示不全_chelen_jak的博客-程序员宝宝

原文出处:https://blog.csdn.net/echarts x轴标签文字过多导致显示不全如图:解决办法1:xAxis.axisLabel 属性axisLabel的类型是object ,主要作用是:坐标轴刻度标签的相关设置。(当然yAxis也是一样有这个属性的)axisLabel: {interval:0,rotate:40}以上就可解决x轴文字显示不全...

【CentOs7笔记1】_weixin_34242819的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...