java阶段七容器集合之Map------练习1

本文概述了Map数据结构在Java中的应用,包括HashMap的底层原理、常见实现类及其特点,如无序的HashMap和有序的TreeMap。还展示了如何遍历Map并操作学生数据结构,以及模拟斗地主洗牌发牌的过程。

1. Map存储数据的特点是什么?

将键映射到值对象,一个映射不能包含重复的键;每个键最多只能映射到一个值。

2. 描述HashMap的底层实现原理(jdk 8版)?

数组+链表+红黑树

3. Map中常用实现类有哪些?各自有什么特点?

①HashMap的特点:无序,根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

②TreeMap的特点:有序,并不是存储有序,能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器。TreeMap不允许key的值为null。非同步的。;

4. 如何遍历Map中的key-value对,代码实现(至少2种)

方式一:通过键值获取值;

Set keySet = hashMap.keySet();

for(String key ; keySet){

String value = hashMap.get(key);

System.out.println(key + value);

}

方式二:通过键值对获取键和值

Set<Map.entry> entrySet = hashMap.entrySet();

for(String me : entrySet){

String key = me.getKey();

String value = me.getValue();

System.out.println(key + value);

}

5. Collection和Collections的区别?

Collection是List和Set的接口,Collections是集合操作的工具类;

6. Map接口中的常用方法有哪些 ?

V put(K key,V value):添加键值对

V remove(Object key):通过键删除值

void clear():清空Map集合

boolean isEmpty():判空

V get(Object key):通过键获取值

Set keySet():获取所有键集合,返回键值对Set集合

Collection.value():获取所有值

Set entrySet():获取所有键值对集合,返回键值对Set集合

7. (Map)已知某学校的教学课程内容安排如下:
前者是老师,后者是老师所教的课程:
(“Tom”, “CoreJava”);
(“John”, “Oracle”);
(“Susan”, “Oracle”);
(“Jerry”, “JDBC”);
(“Jim”, “Unix”);
(“Kevin”, “JSP”);
(“Lucy”, “JSP”);

完成下列要求:
1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
2) 增加了一位新老师Allen 教JDBC
3) Lucy 改为教CoreJava
4) 遍历Map,输出所有的老师及老师教授的课程(用Set<Map.Entry<String,String>>、Set get(key)都可)
5) 利用Map,输出所有教JSP 的老师。

public class Work7_Map_0_7 {
    public static void main(String[] args) {
        //创建Map集合
        Map<String, String> map = new HashMap<String, String>();

        //1)使用一个Map,以老师的名字作为键,以老师教授的课程名作为值
        map.put("Tom", "CoreJava");
        map.put("John", "Oracle");
        map.put("Susan", "Oracle");
        map.put("Jerry", "JDBC");
        map.put("Jim", "Unix");
        map.put("Kevin", "JSP");
        map.put("Lucy", "JSP");

        //2)增加了一位新老师Allen 教JDBC
        map.put("Allen","JDBC");

        //3)Lucy 改为教CoreJava
        map.put("Lucy","CoreJava");

        //4) 遍历Map,输出所有的老师及老师教授的课程(用Set<Map.Entry<String,String>>、Set<String> get(key)都可)
        Set<String> keySet = map.keySet();
        for (String key : keySet){
            String value = map.get(key);
            System.out.println(key + ":" + value);
        }
        System.out.println("--------------------");
        //5) 利用Map,输出所有教JSP 的老师。
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Map.Entry<String, String> me : entrySet){
            if (me.getValue().equals("JSP")){
                String key = me.getKey();
                String value = me.getValue();
                System.out.println(key + ":" + value);
            }
        }
    }
}

输出结果:

Kevin:JSP
Tom:CoreJava
Susan:Oracle
John:Oracle
Lucy:CoreJava
Jerry:JDBC
Allen:JDBC
Jim:Unix


Kevin:JSP

8. `学生属性:姓名,年龄
注意:姓名和年龄相同的学生视为一个学生。
保证学生的唯一性。

1、描述学生
2、定义map容器,将学生作为键,地址作为值存入
3、获取map集合中的元素

学生类:

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = 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 "姓名:" + name +
                ", 年龄:" + age ;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

测试类:

public class Work7_Map_0_8 {
    public static void main(String[] args) {
        //定义map容器
        Map<Student,String> map = new HashMap<Student,String>();

        //将学生作为键,地址作为值存入
        map.put(new Student("Rock",20),"广东");
        map.put(new Student("Lara",22),"上海");
        map.put(new Student("Elence",30),"深圳");
        map.put(new Student("Rock",20),"深圳");

        //获取map集合中的元素
        Set<Student> studentSet = map.keySet();
        for (Student key : studentSet){
            String value = map.get(key);
            System.out.println(key + ":" + value);
        }

    }
}

输出结果:

姓名:Elence, 年龄:30:深圳
姓名:Rock, 年龄:20:深圳
姓名:Lara, 年龄:22:上海

9. 模拟斗地主洗牌发牌(争取根据自己的思路再写一遍)

1、分析:首先应准备牌:完成数字与纸牌的映射关系:使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系。
洗牌:通过数字完成洗牌发牌(借助工具类)
发牌:将每个人以及底牌设计,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌给3个玩家。存放的过程中要求数字大小与斗地主规则的大小对应排序。将代表不同纸牌的数字分配给不同的玩家与底牌。
看牌:通过Map集合找到对应字符展示。通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

public class Work7_Map_0_9 {
    public static void main(String[] args) {
        //创建一个map集合键为牌的编号,值为牌
        HashMap<Integer, String> hashMap = new HashMap<Integer, String>();

        //创建一个集合装键
        ArrayList<Integer> keyArray = new ArrayList<Integer>();

        //创建花色数组和点数数组
        String[] colors = {"♦", "♥", "♠", "♣"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

        int index = 0;
        //给hashMap中的键和值赋值
        for (String number : numbers) {
            for (String color : colors) {
                hashMap.put(index, color + number);
                keyArray.add(index);
                index++;
            }
        }
        hashMap.put(index, "大王");
        keyArray.add(index);
        index++;
        hashMap.put(index, "小王");
        keyArray.add(index);

        //洗牌,也就是洗编号
        Collections.shuffle(keyArray);

        //创建玩家  保证排序使用TreeSet默认编号的升序
        TreeSet<Integer> pamela = new TreeSet<Integer>();
        TreeSet<Integer> sour = new TreeSet<Integer>();
        TreeSet<Integer> lee = new TreeSet<Integer>();
        TreeSet<Integer> dp = new TreeSet<Integer>();

        //发牌,通过键编号值找到牌值
        for (int i = 0; i < keyArray.size(); i++) {
            //三位玩家获取牌的编号
            int x = keyArray.get(i);
            if (i >= keyArray.size()-3) {
                dp.add(x);
            }else if (i % 3 == 0) {
                pamela.add(x);
            } else if (i % 3 == 1) {
                sour.add(x);
            } else if (i % 3 == 2) {
                lee.add(x);
            }
        }

        //看牌
        lookPoker("pamela",pamela,hashMap);
        lookPoker("sour",sour,hashMap);
        lookPoker("lee",lee,hashMap);
        lookPoker("底牌",dp,hashMap);


    }

    //通过玩家集合中的键获取牌 打印输出
    public static void lookPoker(String name,TreeSet<Integer> treeSet,HashMap<Integer,String> hashMap){
          System.out.print(name+"的牌是:");
            //通过键值获取对象
            for (Integer key : treeSet){
                String value = hashMap.get(key);
                System.out.print(value + " ");
            }
        System.out.println();
    }
}

输出结果:

pamela的牌是:♦3 ♥3 ♣3 ♥4 ♠4 ♥6 ♣6 ♠7 ♥8 ♠8 ♣8 ♦9 ♠J ♦Q ♥Q ♠K ♦A
sour的牌是:♠3 ♦4 ♦5 ♣5 ♦6 ♠6 ♦7 ♣9 ♦10 ♥10 ♣10 ♠Q ♣Q ♦K ♣K ♥A ♠2
lee的牌是:♣4 ♥5 ♠5 ♥7 ♣7 ♦8 ♠9 ♠10 ♥J ♣J ♥K ♠A ♣A ♦2 ♥2 大王 小王
底牌的牌是:♥9 ♦J ♣2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值