Java--Map集合

在这里插入图片描述

  • Map中的元素是双列的,一列是键,一列是指,键和值是一一对应的。
  • Map集合的数据结构只针对键有效,与值无关

Map集合中常用的方法

在这里插入图片描述

HashMap

  • 演示:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test1 {
    public static void main(String[] args) {
        HashMap<Integer, String> hm = new HashMap<>();
        //在集合中添加元素
        hm.put(1,"小黄");
        hm.put(3,"小张");
        hm.put(2,"小红");
        hm.put(6,"小蓝");
        hm.put(5,"小美");
        hm.put(3,"小前");
        /**
         * 遍历集合有两种方式:
         * 1--先找出键,然后通过键找到值
         * 2--直接找出所有键值对
         */
        //根据键找值
        Set<Integer> key = hm.keySet();
        for(Integer in:key){
            String s = hm.get(in);
            System.out.println(in+"--"+s);
        }
        System.out.println("-----------------------");
        //直接找出键值对
        Set<Map.Entry<Integer, String>> entries = hm.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            Integer key1 = entry.getKey();
            String value = entry.getValue();
            System.out.println(key1+"--"+value);
        }
    }
}
程序结果为:
1--小黄
2--小红
3--小前
5--小美
6--小蓝
-----------------------
1--小黄
2--小红
3--小前
5--小美
6--小蓝

HashMap存储自写类时重写hashcode和equals方法才能实现元素唯一,因为HashMap的数据结构只是针对键的

  • 演示Student类中未重写hashcode和equals:
import java.util.HashMap;
import java.util.Set;

public class Test2 {
    public static void main(String[] args) {
        HashMap<Integer, Student> hm = new HashMap<>();
        hm.put(4,new Student("小黄",20));
        hm.put(3,new Student("小张",19));
        hm.put(6,new Student("小黄",20));
        hm.put(1,new Student("小红",17));
        hm.put(3,new Student("小蓝",15));
        //找出键,然后找到值
        Set<Integer> key = hm.keySet();
        for (Integer in : key) {
            Student student = hm.get(in);
            System.out.println(in+"--"+student.getName()+student.getAge());
        }
    }
}
运行结果为:
1--小红17
3--小蓝15
4--小黄20
6--小黄20
仍然存在重复元素,重写hashcode和equals方法后即可消除重复元素
  • HashMap和HashTable的区别:
    • HashMap: 线程不安全,效率高.允许null值和null键
    • Hashtable: 线程安全 , 效率低.不允许null值和null键

LinkedHashMap

  • LinkedHashMap的数据结构是哈希表和链表,因此是有序且唯一
  • 演示:
import java.util.LinkedHashMap;
import java.util.Set;

public class Test4 {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(1,"小黄");
        map.put(3,"小张");
        map.put(2,"小红");
        map.put(6,"小蓝");
        map.put(5,"小美");
        map.put(3,"小前");
        Set<Integer> key = map.keySet();
        for (Integer in : key) {
            String s = map.get(in);
            System.out.println(in+"--"+s);
        }
    }
}
运行结果为:
1--小黄
3--小前
2--小红
6--小蓝
5--小美

TreeMap

  • TreeMap的数据结构时哈希表和红黑树,可以实现键唯一和排序
  • 演示:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

public class Test3 {
    public static void main(String[] args) {
        /**
         * 自写类作为键时必须实现Comparable接口
         */
        TreeMap< Student,Integer> treeMap = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num1=o1.getAge()-o2.getAge();
                int num2=num1==0?o1.getName().length()-o2.getName().length():num1;
                int num3=num2==0?o1.getName().compareTo(o2.getName()):num2;
                return num3;
            }
        });
        //在集合中添加元素
       treeMap.put(new Student("小黄",20),4);
       treeMap.put(new Student("小张",19),3);
       treeMap.put(new Student("小黄",20),6);
       treeMap.put(new Student("小红",17),1);
       treeMap.put(new Student("小蓝",15),3);

       //遍历集合
        Set<Student> students = treeMap.keySet();
        for (Student stu : students) {
            Integer integer = treeMap.get(stu);
            System.out.println(integer+"--"+stu.getName()+stu.getAge());
        }

    }
}
程序结果为:
3--小蓝15
1--小红17
3--小张19
6--小黄20

集合的嵌套和输出

  • 演示:
import java.util.HashMap;
import java.util.Set;

public class Test5 {
    public static void main(String[] args) {
        /**
         *     基础班
         *             张三 20
         *             李四 22
         *      就业班
         *             王五 21
         *             赵六 23
         */
        /**
         * 把基础班和就业班作为键先放在一个大的集合里面,然后这个大集合
         * 的值存储的是两个个小集合,小集合中人名为键,年龄为值
         */
        //先声明小集合
        HashMap<String, Integer> jc = new HashMap<>();
        jc.put("张三",20);
        jc.put("李四",22);
        HashMap<String, Integer> jy = new HashMap<>();
        jy.put("王五",21);
        jy.put("赵六",23);
        //声明大集合,键位基础班和就业班,值位jc和jy这两个集合
        ***//注意hm中的HashMap必须写明泛型***
        HashMap<String, HashMap<String,Integer>> hm = new HashMap<>();
        hm.put("基础班",jc);
        hm.put("就业班",jy);
        //现在对hm集合进行遍历即可
        Set<String> keySet = hm.keySet();
        for (String s : keySet) {
            System.out.println(s);
            HashMap<String, Integer> map = hm.get(s);
            Set<String> keySet1 = map.keySet();
            for (String s1 : keySet1) {
                Integer integer = map.get(s1);
                System.out.println("\t\t"+s1+"\t\t"+integer);
            }
        }
    }
}

斗地主排序版

import java.util.*;

public class DouDiZhu {
    public static void main(String[] args) {
        String[] colol={"♥","♠","♦","♣"};
        String[]num={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        HashMap<Integer, String> puke = new HashMap<>();
        ArrayList<Integer> indexs = new ArrayList<>();
        int index=0;
        //装派
        for(String s:num){
            for(String c:colol){
                puke.put(index,s.concat(c));
                indexs.add(index);
                index++;
            }
        }
        puke.put(index,"大王");
        indexs.add(index);
        index++;
        puke.put(index,"小王");
        indexs.add(index);
        //洗牌
        Collections.shuffle(indexs);
        Collections.shuffle(indexs);
        //发牌
        TreeSet<Integer> dipai = new TreeSet<>();
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();
        for (int i = 0; i < indexs.size(); i++) {
            if(i>=indexs.size()-3){
                dipai.add(indexs.get(i));
            }else if(i%3==1){
                player1.add(indexs.get(i));
            }else if(i%3==2){
                player2.add(indexs.get(i));
            }else {
                player3.add(indexs.get(i));
            }
        }
        //看牌
        show(player1,puke);
        show(player2,puke);
        show(player3,puke);
        show(dipai,puke);
    }
    public static void show(TreeSet<Integer> ts,HashMap<Integer, String> puke){
       for(Integer in:ts){
           String s = puke.get(in);
           System.out.print("\t"+s);

       }
        System.out.println();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值