java阶段七容器集合之Map——练习2

  • Post author:
  • Post category:java



1. 目前你所知道的集合容器有哪些?分别有什么特点?

Collection单列集合容器:

List:有序,允许重复元素

ArrayList:有序,允许重复元素,查询快,增删慢;

LinkedList:有序,允许重复元素,查询慢,增删快;

Set:无序,不允许重复元素

HashSet:无序,不允许重复元素,存储和输出顺序不保证

HashSe->LinkedHasSet:无序,不允许重复元素,输入什么顺序,输出什么顺序,并不是存储顺序得到保证;

TreeHashSet:无序,不允许重复元素,默认自然排序,可使用自然排序和比较器排序改变排序规则,并不是存储顺序得到保证;

Map双列集合容器:将键映射到值对象,一个映射不能包含重复的键,一个键只能映射一个值,无序,不允许重复元素。

hashMap:双列,通过键获取值,无序

TreeMap:默认升序,可通过自然排序和比较排序将元素排序


2.定义一个Map接口类型的变量,引用一个实现类,添加键值对,判断集合中是否包含某一key值,通过某一key值得到value值,通过某一key删除键值对,把另一个map集合添加到此map集合,判断是否为空,清除集合,返回集合里元素的个数等常用操作。通过两种方法遍历上题中的map集合

package com.itheima05;

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

/**
 * @Date 2022/5/17 19:22
 * @Author PAMELA
 * @Description  定义一个Map接口类型的变量,引用一个实现类,添加键值对,
 * 判断集合中是否包含某一key值,通过某一key值得到value值,通过某一key删除键值对,
 * 把另一个map集合添加到此map集合,判断是否为空,清除集合,返回集合里元素的个数等常用操作。
 * 通过两种方法遍历上题中的map集合
 */
public class Work7_Map_1_2 {
    public static void main(String[] args) {
        // 定义一个Map接口类型的变量,引用一个实现类
        HashMap<String,String> hashMap = new HashMap<String,String>();

        //添加键值对
        hashMap.put("Stark","Pamela");
        hashMap.put("大乔","小乔");
        hashMap.put("Lisa","Rose");

        //判断集合中是否包含某一key值
        System.out.println(hashMap.containsKey("大乔"));//ture

        //通过某一key值得到value值
        System.out.println(hashMap.get("Stark"));//Pamela

        //通过某一key删除键值对
        hashMap.remove("大乔");
        System.out.println(hashMap); //{Stark=Pamela, Lisa=Rose}

        //把另一个map集合添加到此map集合
        HashMap<String,String> hashMap1 = new HashMap<String,String>();
        hashMap1.putAll(hashMap);

        //判断是否为空
        System.out.println(hashMap.isEmpty());//false

        //清除集合
        hashMap.clear();

        //返回集合里元素的个数
        System.out.println(hashMap.size()); //0

        //通过两种方法遍历上题中的map集合
        //方式一
        Set<String> keySet = hashMap1.keySet();
        for (String key : keySet){
            String value = hashMap1.get(key);
            System.out.println("key:" + " , "+"value:" + value);
        }
        System.out.println("-------------------------");
        //方式二
        Set<Map.Entry<String, String>> entrySet = hashMap1.entrySet();
        for (Map.Entry<String, String> me : entrySet){
            String key = me.getKey();
            String value = me.getValue();
            System.out.println("key:" + " , "+"value:" + value);
        }


    }
}

输出结果:

true

Pamela

{Stark=Pamela, Lisa=Rose}

false

0

key: , value:Pamela

key: , value:Rose

key: , value:Pamela

key: , value:Rose


3. 使用Map接口的实现类完成员工工资(姓名–工资)的摸拟:

1)添加几条信息

2)列出所有的员工姓名

3列出所有员工姓名及其工资

4)删除名叫“Tom”的员工信息

5)输出Jack的工资,并将其工资加1000元(通过取值实现)

6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)

public class Work7_Map_1_3 {
    public static void main(String[] args) {
        HashMap<String,Integer> hashMap = new HashMap<String,Integer>();

        //1)添加几条信息
        hashMap.put("Pamela",5000);
        hashMap.put("Jack",4800);
        hashMap.put("Tom",6100);
        hashMap.put("Lee",800);
        hashMap.put("Lara",500);

        //2)列出所有的员工姓名
        Set<String> keySet = hashMap.keySet();
        System.out.println("员工姓名:"+keySet);

        //3)列出所有员工姓名及其工资
        for (String key : keySet){
            //5)输出Jack的工资,并将其工资加1000元(通过取值实现)
            if (hashMap.get(key).equals("Jack")){
                int value = hashMap.get(key) + 1000;
                hashMap.put("Jack",value);
            }

            //6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)
            if (hashMap.get(key) < 1000){
                double value = (hashMap.get(key) + (hashMap.get(key)*0.2));
                hashMap.put(key,(int)value);
            }
            int value = hashMap.get(key);
            System.out.println("姓名:" + key + " , " + "工资:" + value);
        }

        //4)删除名叫“Tom”的员工信息
        hashMap.remove("Tome");
    }
}

输出结果:

员工姓名:[Lara, Pamela, Tom, Jack, Lee]

姓名:Lara , 工资:600

姓名:Pamela , 工资:5000

姓名:Tom , 工资:6100

姓名:Jack , 工资:4800

姓名:Lee , 工资:960


4. 使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资,存入数据如下:

张三——800元;李四——1500元;王五——3000元;

1)将张三的工资更改为2600元

2)为所有员工工资加薪100元;

3)遍历集合中所有的员工

4)遍历集合中所有的工资

public class Work7_Map_1_4 {
    public static void main(String[] args) {
        //使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资
        HashMap<String,Integer> m1 = new HashMap<String,Integer>();

        //存入数据如下: 张三——800元;李四——1500元;王五——3000元;
        m1.put("张三",800);
        m1.put("李四",1500);
        m1.put("王五",3000);

        //1)将张三的工资更改为2600元
        m1.put("张三",2600);

        //2)为所有员工工资加薪100元;
        Set<String> keySet = m1.keySet();
        for (String key : keySet){
            int value = m1.get(key) + 100;
            //3)遍历集合中所有的员工
            System.out.print("员工:" + key);
            //4)遍历集合中所有的工资
            System.out.println(" ,工资:" + value);
        }
    }
}

输出结果:

员工:李四 ,工资:1600

员工:张三 ,工资:2700

员工:王五 ,工资:3100


5. 按要求完成如下操作

1 )封装一个汽车类,包含String name、int speed属性,在测试类中实例化三个对象:c1,c2,c3,分别设置name为:“奥拓”,“宝马”,“奔驰”,速度分别设置为:100,200,300

2 )使用Map集合对象m1将这三个汽车类对象保存成key,然后将int型的汽车价钱作为值保存在m1的value中,上述三款汽车分别对应的价钱是10000,500000,2000000

3 )遍历m1的键,打印name属性

4 )通过合适的方法,求出m1中“宝马”的价格,并打印结果;

5 )经过折旧,所有汽车都降价到原来的80%,请打印降价后“宝马”的价格

public class Work7_Map_1_5 {
    public static void main(String[] args) {
        //在测试类中实例化三个对象:c1,c2,c3,
        //分别设置name为:“奥拓”,“宝马”,“奔驰”,速度分别设置为:100,200,300
        Car c1 = new Car("奥拓", 100);
        Car c2 = new Car("宝马", 200);
        Car c3 = new Car("奔驰", 300);

        //2 )使用Map集合对象m1将这三个汽车类对象保存成key
        HashMap<Car, Integer> hashMap = new HashMap<>();

        //然后将int型的汽车价钱作为值保存在m1的value中,上述三款汽车分别对应的价钱是10000,500000,2000000
        hashMap.put(c1, 10000);
        hashMap.put(c2, 500000);
        hashMap.put(c3, 2000000);

        //3 )遍历m1的键,打印name属性
        Set<Car> keySet = hashMap.keySet();
        int i = 1;
        for (Car car : keySet) {
            System.out.print("car" + i++ + "name:" + car.getName() + "   ");

        }

        for (Car car : keySet) {
            //4 )通过合适的方法,求出m1中“宝马”的价格,并打印结果;
            if (car.getName().equals("宝马")) {
                int price = hashMap.get(car);
                System.out.println("\n宝马价格为:" + price);
            }
            //5 )经过折旧,所有汽车都降价到原来的80%,请打印降价后“宝马”的价格
            double price1 = hashMap.get(car) - (hashMap.get(car) * 0.2);
            hashMap.put(car, (int) price1);
        }
        //请打印降价后“宝马”的价格
        for (Car car : keySet) {
            if (car.getName().equals("宝马")) {
                int price = hashMap.get(car);
                System.out.println("宝马价格为:" + price);
            }
        }

    }
}

输出结果:

car1name:奔驰 car2name:宝马 car3name:奥拓

宝马价格为:500000

宝马价格为:400000


6.按要求完成如下操作

1 ) 要求集合对象c1中,只能添加字符串形式的单个元素,元素可以重复,在测试类中为c1集合添加字符串“这是一个可以重复的集合”三遍,然后遍历打印结果。

2 )要求集合对象c2中只能添加整型数值,并且不可重复,按自然顺序排序。要求遍历集合对象,打印添加进1,2,3,4,5五个数字的c2集合

3 )要求创建一个合适的Map集合对象m1,它的键和值都只能是字符串,并且值可以是null,像map集合中添加三组字符串,其中一个只有键,值是空,遍历这个集合对象的键,并打印键。

4)想办法将m1中所有值为null都替换成一个字符串”这里是空值”

5)遍历m1的所有值。

public class Work7_Map_1_6 {
    public static void main(String[] args) {
        //1 ) 要求集合对象c1中,只能添加字符串形式的单个元素,元素可以重复,
        ArrayList<String> c1 = new ArrayList<>();

        //在测试类中为c1集合添加字符串“这是一个可以重复的集合”三遍,然后遍历打印结果。
        c1.add("这是一个可以重复的集合");
        c1.add("这是一个可以重复的集合");
        c1.add("这是一个可以重复的集合");
        for (String s : c1) {
            System.out.print(s + "  ");  //这是一个可以重复的集合  这是一个可以重复的集合  这是一个可以重复的集合
        }
        System.out.println();

        //2 )要求集合对象c2中只能添加整型数值,并且不可重复,按自然顺序排序。
        TreeSet<Integer> c2 = new TreeSet<>();

        //要求遍历集合对象,打印添加进1,2,3,4,5五个数字的c2集合
        c2.add(1);
        c2.add(5);
        c2.add(3);
        c2.add(4);
        c2.add(2);
        for (Integer i : c2) {
            System.out.print(  i + " "); //1 2 3 4 5
        }
        System.out.println();

        //3 )要求创建一个合适的Map集合对象m1,它的键和值都只能是字符串,
        Map<String, String> m1 = new HashMap<>();

        // * 并且值可以是null,像map集合中添加三组字符串,其中一个只有键,值是空,
        m1.put("001", "Pamela");
        m1.put("002", "Lara");
        m1.put("003", null);

        // * 遍历这个集合对象的键,并打印键。
        Set<String> keySet = m1.keySet();
        for (String key : keySet) {
            System.out.print("key:" + key + "  ");  //key:001  key:002  key:003

            //4)想办法将m1中所有值为null都替换成一个字符串”这里是空值”
            if (m1.get(key) == null){
                m1.put(key,"这里是空值");
            }
        }
        System.out.println();

        //5)遍历m1的所有值。
        for (String key : keySet) {
            String value = m1.get(key);
            System.out.println("key:" + key + " , " + "value:" + value);
        }
    }
}

输出结果:

1 2 3 4 5

key:001 key:002 key:003

key:001 , value:Pamela

key:002 , value:Lara

key:003 , value:这里是空值


7.【1】将以下车站对应关系的数据存储到map集合中,

key:表示站编号,value:表示站名,

并遍历打印(可以不按顺序打印):

站编号和站名对应关系如下:

1 朱辛庄

2 育知路

3 平西府

4 回龙观东大街

5 霍营

6 育新

7 西小口

8 永泰庄

9 林萃桥

10 森林公园南门

11 奥林匹克公园

12 奥体中心

13 北土城

14 安华桥

15 安德里北街

16 鼓楼大街

17 什刹海

18 南锣鼓巷

19 中国美术馆

【2】计算地铁票价规则:

总行程 3站内(包含3站)收费3元,

3站以上但不超过5站(包含5站)的收费4元,

5站以上的,在4元的基础上,每多1站增加2元,

10元封顶;

需要对键盘录入的上车站

和到达站进行判断,如果没有该站,

提示重新输入,直到站名存在为止

每站需要2分钟



示范如下:

请输入上车站:

流沙河

   您输入的上车站:流沙河站不存在,请重新输入上车站:
   骑龙
   
   您输入的上车站:骑龙站不存在,请重新输入上车站:
   朱辛庄
   您以确定在朱辛庄上站!
   
   请输入到达站:
   沙河
   
   您输入的到达站:沙河站不存在,请重新输入到达站:
   西二旗
    
   您输入的到达站:西二旗站不存在,请重新输入到达站:
   西小口
   您以确定在朱辛庄下站!
   
   从朱辛庄到西小口共经过6站收费6元,大约需要12分钟
public class Work7_Set_1_7 {
    public static void main(String[] args) {
        //创建Map集合
        Map<Integer, String> map = new HashMap<>();

        //key:表示站编号,value:表示站名
        map.put(1, "朱辛庄");
        map.put(2, "育知路");
        map.put(3, "平西府");
        map.put(4, "回龙观东大街");
        map.put(5, "霍营");
        map.put(6, "育新");
        map.put(7, "西小口");
        map.put(8, "永泰庄");
        map.put(9, "林萃桥");
        map.put(10, "森林公园南门");
        map.put(11, "奥林匹克公园");
        map.put(12, "奥体中心");
        map.put(13, "北土城");
        map.put(14, "安华桥");
        map.put(15, "安德里北街");
        map.put(16, "鼓楼大街");
        map.put(17, "什刹海");
        map.put(18, "南锣鼓巷");
        map.put(19, "中国美术馆");

        //并遍历打印(可以不按顺序打印):
        Set<Integer> keySet = map.keySet();
        for (Integer key : keySet) {
            String value = map.get(key);
            System.out.println(key + " : " + value);
        }

        //【2】计算地铁票价规则:
        Scanner scanner = new Scanner(System.in);
        String upStation = "";
        String getStation = "";
        int upNum = 0;
        int getNum = 0;
        System.out.println("请输入上车站:");
        Set<Integer> keySet1 = map.keySet();
        boolean flag = true;
        while (flag) {
            try {
                //输入上车站
                upStation = scanner.next();
                //map中不包含此站抛异常
                if (!map.containsValue(upStation)) {
                    throw new Exception(upStation + "站不存在,请重新输入上车站:");
                } else {
                    //遍历集合找到对应站
                    for (Integer key : keySet) {
                        String station = map.get(key);
                        //相匹配的站
                        if (station.equals(upStation)) {
                            //将站编号保留  到站同理
                            upNum = key;
                        }
                    }
                    System.out.println("您以确定在" + upStation + "上站!");
                }
                System.out.println("请输入您的到达站:");
                while (true) {
                    getStation = scanner.next();
                    try {
                        if (!map.containsValue(getStation)) {
                            throw new Exception(getStation + "站不存在,请重新输入到达站:");
                        } else {
                            for (Integer key : keySet) {
                                String station = map.get(key);
                                if (station.equals(getStation)) {
                                    getNum = key;
                                }
                            }
                            System.out.println("您已确定在" + getStation + "下站!");
                            flag = false;
                            break;
                        }
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }

                //【2】计算地铁票价规则:
                int n = (getNum - upNum);
                int money = 0;
                //3站内(包含3站)收费3元,
                if (n <= 3) {
                    money = 3;
                }
                if (n > 3 && n <= 5) { //3站以上但不超过5站(包含5站)的收费4元
                    money = 4;
                }
                if (n > 5) { //5站以上的,在4元的基础上,每多1站增加2元
                    money = 4 + (n - 5) * 2;
                    if (money >= 10) {//10元封顶
                        money = 10;
                    }
                }
                System.out.println("从" + upStation + "到" + getStation +
                        "共经过" + n + "站" + "收费" + money +
                        "元,大约需要" + n * 2 + "分钟");

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

输出结果:

请输入上车站:

朱辛庄

您以确定在朱辛庄上站!

请输入您的到达站:

南锣鼓巷

您已确定在南锣鼓巷下站!

从朱辛庄到南锣鼓巷共经过17站收费10元,大约需要34分钟



版权声明:本文为qq_45043813原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。