Java练习——Map集合

Java练习——Map集合

第一题

1、从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。
2、在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯

思路分析

  • 通过System.out.println提示用户输入年份或国家。
  • 使用input.nextInt()或input.next()读取用户输入。
  • 使用map.containsKey(year)来检查年份是否存在于Map中。
  • 如果存在,输出该年的世界杯冠军;否则,输出“没有举办世界杯”。
  • 对于第二个功能,使用map.containsValue(country)来检查输入的国家是否是某个世界杯的冠军。
  • 如果存在,输出该国家的夺冠年份列表;否则,输出“没有获得过冠军”。

完整代码

package Test1;

import java.util.HashMap;
import java.util.Scanner;

/*
历届世界杯冠军
* */
public class WorldCupEntity {
    public static void main(String[] args) {
        // 创建一个Scanner对象,用于从命令行读取用户输入
        Scanner input = new Scanner(System.in);
        // 创建一个HashMap对象,用于存储每个世界杯的年份和冠军信息
        HashMap map = new HashMap();
        map.put(1930, "乌拉圭");
        map.put(1934, "意大利");
        map.put(1938, "意大利");
        map.put(1950, "乌拉圭");
        map.put(1954, "西德");
        map.put(1958, "巴西");
        map.put(1962, "巴西");
        map.put(1966, "英格兰");
        map.put(1970, "巴西");
        map.put(1974, "西德");
        map.put(1978, "阿根廷");
        map.put(1982, "意大利");
        map.put(1986, "阿根廷");
        map.put(1990, "西德");
        map.put(1994, "巴西");
        map.put(1998, "法国");
        map.put(2002, "巴西");
        map.put(2006, "意大利");
        map.put(2010, "西班牙");
        map.put(2014, "德国");
        map.put(2018, "法国");

        //从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。
        //如果该年没有举办世界杯,则输出:没有举办世界杯。
        System.out.println("请输入年份:");
        int year = input.nextInt();
        //判断HashMap中是否包含该年份作为键的值:如果包含则说明该年份举办了世界杯,输出该年的世界杯冠军;否则输出没有举办世界杯
        if (map.containsKey(year)) {
            System.out.println(year + "年的世界杯冠军是" + map.get(year));
        } else {
            System.out.println("没有举办世界杯");
        }

        //读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002
        //读入“荷兰”,应当输出 没有获得过世界杯
        System.out.println("请输入国家:");
        String country = input.next();
        //如果HashMap中包含该球队名字作为值的元素,则输出该球队的夺冠年份列表;否则输出该球队没有获得过冠军的信息。
        if (map.containsValue(country)) {
            System.out.println(country + "夺冠年份是:");
            for (Object y : map.keySet()) {
                if (map.get(y).equals(country)) {
                    System.out.print(y + "\t");
                }
            }
        } else {
            System.out.println(country + "没有获得过冠军");
        }
    }
}

运行结果

在这里插入图片描述

第二题

使用Map完成如下功能:
在控制台输入一串字符串,统计字符串中每个字符出现的次数,并按照次数的降序进行排序
存放: 某个字符,以及该字符出现的次数
Key: 字符
Value: 次数

思路分析

  • 输入字符串:程序提示用户输入一串字符串,然后使用Scanner类读取用户输入的字符串。
  • 转换为字符数组:程序将用户输入的字符串转换为字符数组,这样可以通过遍历数组来处理每个字符。
  • 初始化Map:使用一个HashMap来存储每个字符及其出现的次数。
  • 遍历字符数组并计数:遍历字符数组,对每个字符进行判断。如果该字符已经在Map中(即该字符已经出现过),则将该字符的计数加1;如果该字符不在Map中,则在Map中添加该字符,并将计数设为1。
  • 输出结果:程序使用一个Iterator遍历Map的entrySet,输出每个字符及其出现的次数。
  • 降序排序:程序创建一个新的列表,包含Map的entrySet,然后使用Collections.sort方法按照出现次数进行降序排序。排序时使用了一个自定义的比较器(Comparator),该比较器比较两个Map.Entry对象的值(即字符出现的次数)。
  • 输出排序后的结果:程序再次使用Iterator遍历排序后的列表,并输出每个字符及其出现的次数。

完整代码

package Test2;

import java.util.*;

public class TreMap {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一串字符串:");
        String str = input.next();
        // 将字符串转换为字符数组
        char [] chars = str.toCharArray();
        // 使用Map,用于存储字符及出现的次数
        Map<Character,Integer> map = new HashMap<>();
        // 遍历字符数组
        for (char c : chars){
            // 如果字符存在
            if (map.containsKey(c)){
                //定义变量存储字符出现的次数
                Integer value = map.get(c);
                // 次数加1
                value++;
                // 更新value的值,添加新的字符,次数为1
                map.put(c,value);
            }else {//若字符不存在,
                map.put(c,1);
            }
        }

        // 获取Map的所有键值对
        Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
        // 获取迭代器,用于遍历键值对集合
        Iterator<Map.Entry<Character, Integer>> iterator = entrySet.iterator();
        // 判断是否还有下一个键值对
        while (iterator.hasNext()) {
            // 获取下一个键值对
            Map.Entry<Character, Integer> entry = iterator.next();
            Character key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("字符\"" + key + "\"的次数为:" + value);
        }
        System.out.println("----------------------------------");

        //将次数进行降序排列
        System.out.println("降序排列后:");
        // 创建一个新的列表,列表元素是map的键值对
        List<Map.Entry<Character,Integer>> list = new ArrayList<>(map.entrySet());
        // 使用Collections.sort方法对列表进行排序,排序规则由下面的Comparator对象定义
        // Comparator是一个接口,它定义了一个名为compare的方法,该方法用来比较对象的大小
        Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
            @Override
            // 这里定义了compare方法,该方法接收两个参数,分别是两个Map.Entry对象
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                // 比较两个Map.Entry对象的值(Integer类型),返回结果是o2与o1值的比较结果
                // 值较大的Map.Entry对象会被放在后面,从而实现降序排序
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        // 遍历排序后的列表
        for (Map.Entry<Character,Integer> entry : list){
            Character key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("字符\"" + key + "\"的次数为:" + value);
        }
   }
}

运行结果

在这里插入图片描述

第三题

(Map)设计Account 对象如下:
private long id;
private double balance;
private String password;
要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下:
List list = new ArrayList();
list.add(new Account(10.00, “1234”));
list.add(new Account(15.00, “5678”));
list.add(new Account(0, “1010”));
要求把List 中的内容放到一个Map 中,该Map 的键为id,值为相应的Account 对象。 最后遍历这个Map,打印所有Account 对象的id 和余额。

思路分析

  • 创建账户列表:首先,创建了一个ArrayList对象,并向其中添加了三个Account对象,每个对象代表一个账户,包含一个余额(double类型)和一个账号(String类型)。
  • 创建账户映射:然后,创建了一个HashMap对象,并将ArrayList中的Account对象作为值,与一个整数(1、2、3)作为键进行映射。这样,我们可以通过这个整数键快速找到对应的Account对象。
  • 遍历映射:通过entrySet()方法获取HashMap的键值对集合,然后使用Iterator遍历这个集合。在每次迭代中,我们获取当前的键值对,其中键是整数值(1、2、3),值是Account对象。然后,我们将键和值分别打印出来。

完整代码

Account:

package Test4;

public class Account {
    private long id;
    private double balance;
    private String password;

    public Account(int i, String s) {
    }

    public Account(double balance, String password) {
        this.balance = balance;
        this.password = password;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString(){
        return getBalance()+" ";
    }
}

AccountTest:

package Test4;

import java.util.*;

public class AccountTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Account(10.00, "1234"));
        list.add(new Account(15.00, "5678"));
        list.add(new Account(0.00,"1010"));

        Map map = new HashMap<>();
        map.put(1,list.get(0));
        map.put(2,list.get(1));
        map.put(3,list.get(2));

        Set<Map.Entry<Integer, Account>> entrySet = map.entrySet();
        // 获取迭代器,用于遍历键值对集合
        Iterator<Map.Entry<Integer, Account>> iterator = entrySet.iterator();
        // 判断是否还有下一个键值对
        while (iterator.hasNext()) {
            // 获取当前的键值对
            Map.Entry<Integer, Account> entry = iterator.next();
            Integer key = entry.getKey();
            Account value = entry.getValue();
            System.out.println("ID:" + key + "\t余额:" + value);
        }
    }
}

运行结果

在这里插入图片描述

第四题

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

思路分析

  • 创建教师与课程的映射:首先,创建了一个HashMap对象,用于存储教师与他们所教授的课程之间的映射关系。键是教师的名字(String类型),值是教师所教授的课程名(String类型)。
  • 添加和修改映射关系:代码中先向映射中添加了几个教师和他们的课程,然后通过map.put()方法修改了Lucy教师所教授的课程,并增加了一位新教师Allen。
  • 遍历并输出映射关系:使用迭代器遍历整个映射,并使用System.out.println()方法输出每个教师的名字和他们所教授的课程。
  • 筛选教特定课程的教师:使用for-each循环遍历所有的键(即所有的教师名字),然后通过map.get(k).equals(“JSP”)判断该教师是否教授JSP课程。如果是,就输出该教师的名字。

完整代码

package Test5;

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

public class TeacherEntity {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        //使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
        map.put("Lucy", "C++");
        map.put("Cindy", "JSP");
        map.put("Amy", "CoreJava");
        map.put("Tom", "JSP");
        map.put("windy", "HTML");
        map.put("Kevin", "JSP");

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

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

        //遍历Map,输出所有的老师及老师教授的课程
        // 获取Map的所有键值对
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        // 获取迭代器,用于遍历键值对集合
        Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
        // 判断是否还有下一个键值对
        while (iterator.hasNext()) {
            // 获取当前的键值对
            Map.Entry<String, String> entry = iterator.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("老师姓名:" + key + "\t\t老师所教授的课程:" + value);
        }

        //利用Map,输出所有教JSP 的老师
        System.out.println("-------------------------------------");
        System.out.println("教JSP 的老师有:");
        // 遍历Map的所有键,即所有老师的名字
        for (String k : map.keySet()) {
            // 判断指定老师是否教授JSP课程,如果是,输出该老师的名字
            if (map.get(k).equals("JSP")) {
                System.out.println(k);
            }
        }
    }
}

运行结果

在这里插入图片描述

总结

  • Map通过键-值(key-value)对的形式来存储数据
  • Map的实现:HashMap(使用频率最高的),TreeMap,HashTable
  • Map中,key可以为任意类型,但这里建议使用String,value也可以是任意类型
  • Map里面多个value可以是不同类型
  • Map里面key是可以重复的,当key重复时,后存入的数据会覆盖前面的数据
  • Map里面,value可以重复.
  • Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的
  • Map中value可以是null,多个value可以同时为null。
  • Map中的key在底层可以理解为是一个Set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值