第12章_集合框架拓展练习(ArrayList,HashSet,TreeSet,HashMap,斗地主,省市联动)

发布时间:2024年01月17日

第12章_集合框架拓展练习


ArrayList

1、随机验证码

  • 随机验证码。

    • 随机生成十组六位字符组成的验证码。
    • 验证码由大小写字母、数字字符组成。
  • 代码实现,效果如图所示:

    在这里插入图片描述

  • 开发提示:

    • 使用字符数组保存原始字符,利用Random类生成随机索引。
    • 将十组验证码放到集合中
    • 用Iterator迭代器遍历集合
public class Exercise1 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		char[] arr = new char[26+26+10];
		
		//使用字符数组保存原始字符
		for (int i = 0; i < arr.length; i++) {
			if(i<10){//前10个放数字
				arr[i] = (char)(i+48);
			}else if(i<10+26){//中间26个放大写字母
				arr[i] = (char)(i+65-10);
			}else{//剩下的放小写字母
				arr[i] = (char)(i+97-10-26);
			}
		}
		
		//随机生成10组验证码
		ArrayList list = new ArrayList();
		Random rand = new Random();
		for (int i = 0; i < 10; i++) {
			String str = "";
			for (int j = 0; j < 6; j++) {
				int index = rand.nextInt(arr.length);
				str += arr[index];
			}
			list.add(str);
		}
		
		Iterator iter = list.iterator();
		while(iter.hasNext()){
			System.out.println("随机验证码:" + iter.next());
		}
	}
}

2、学生信息录入

  • 定义学生类,属性为姓名,年龄,使用学生对象保存录入数据。

  • 键盘录入学生信息,保存到集合中。

    • 循环录入的方式,1:表示继续录入,0:表示结束录入。
  • 使用ArrayList集合,保存学生对象,录入结束后,用foreach遍历集合。

  • 代码实现,效果如图所示:

    在这里插入图片描述

public class Exercise2 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		
		Scanner input = new Scanner(System.in);
		while(true){
			System.out.print("选择(1、录入;0、退出):");
			int select = input.nextInt();
			if(select == 0){
				break;
			}
			System.out.print("姓名:");
			String name = input.next();
			System.out.print("年龄:");
			int age = input.nextInt();
			
			Student stu = new Student(name,age);
			list.add(stu);
		}
		
		for (Object object : list) {
			System.out.println(object);
		}
         input.close();
	}
}
class Student{
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Student() {
		super();
	}
	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 "Student [name=" + name + ", age=" + age + "]";
	}
	
}

3、扑克牌

案例:

? 1、用一个String[]数组存点数

? 2、用一个String[]数组存花色

? 3、用一个String[]数组存大王、小王

? 4、用上面的数组,生成一副扑克牌

? 5、遍历显示全副扑克牌

? 6、模拟给4个人随机发牌,每个人11张牌

? 7、显示每个人的牌和剩余的牌

? 效果如下:

在这里插入图片描述

public class Exercise3 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		String[] dian = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		String[] hua = {"黑桃","红桃","方片","梅花"};
		String[] wang = {"大王","小王"};
		
		ArrayList list = new ArrayList();
		for (int i = 0; i < dian.length; i++) {
			for (int j = 0; j < hua.length; j++) {
				list.add(hua[j]+dian[i]);
			}
		}
		for (int i = 0; i < wang.length; i++) {
			list.add(wang[i]);
		}
		
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+"  ");
			if((i+1)%10==0){
				System.out.println();
			}
		}
		System.out.println();
		System.out.println("发牌:");
		
		Random rand = new Random();
		ArrayList one = new ArrayList();
		for (int i = 0; i < 11; i++) {
			one.add(list.remove(rand.nextInt(list.size())));
		}
		
		ArrayList two = new ArrayList();
		for (int i = 0; i < 11; i++) {
			two.add(list.remove(rand.nextInt(list.size())));
		}
		
		ArrayList three = new ArrayList();
		for (int i = 0; i < 11; i++) {
			three.add(list.remove(rand.nextInt(list.size())));
		}
		
		ArrayList four = new ArrayList();
		for (int i = 0; i < 11; i++) {
			four.add(list.remove(rand.nextInt(list.size())));
		}
		
		System.out.println("第1个人:" + one);
		System.out.println("第2个人:" + two);
		System.out.println("第3个人:" + three);
		System.out.println("第4个人:" + four);
		System.out.println("剩余:" + list);
	}
}

4、乐透号码

  • 模拟乐透号码。

    • 随机生成10个号码放到集合中,范围1-50,作为乐透号码。不能重复。
    • 键盘录入10个整数放到集合中,范围1-50,不能重复。
    • 录入的整数与乐透号码对比,统计猜中了几个。
  • 代码实现,效果如图所示:

    在这里插入图片描述

开发提示:

  • 当使用集合时,可以通过contains方法,判断某集合中是否包含某元素
@SuppressWarnings("all")
public class Exercise4 {
    public static void main(String[] args) {
        ArrayList lotNumList = lotNum();
        System.out.println("乐透号码已经生成,游戏开始:");
        ArrayList inputList = inputNum();
        System.out.println("您输入的号码为:"+inputList);
        int count  =  countNum(inputList , lotNumList);
        System.out.println("乐透号码为:"+lotNumList);
        System.out.println("猜中了:"+count+"个数字");
    }

	public static int countNum(ArrayList inputList, ArrayList lotNumList) {
        int  count  = 0;
        for (int i = 0; i < inputList.size(); i++) {
            Object num  = inputList.get(i);
            if (lotNumList.contains(num)){
                count++;
            }
        }
        return count ;
    }
	
    public static ArrayList inputNum(){
        ArrayList list = new ArrayList();
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 10; ) {
            System.out.println("请输入第"+(i+1)+"个数字[1-50]:");
            int num  = sc.nextInt();

            if (num >=1 && num<=50 && !list.contains(num)){
                list.add(num);
                i++;
            }else{
                System.out.println(num+"重复录入数字无效,请重新输入");
            }
        }
        sc.close();
        return list;
    }
	
    public static ArrayList lotNum(){
        ArrayList list = new ArrayList();
        Random r = new Random();
        for (int i = 0; i < 10; ) {
            int num  = r.nextInt(50) + 1;

            if (!list.contains(num)){
                list.add(num);
                i++;
            }
        }
        return list;
    }
}

5、随机数问题

案例:

? 1、随机生成10个[1,100]之间的整数,放到List集合中,遍历显示

? 2、找出前3名最大值,删除它们,注意可能重复

? 3、显示删除后的结果

? 效果如下:

在这里插入图片描述

@SuppressWarnings("all")
public class Exercise5 {
	public static void main(String[] args) {
		ArrayList nums = getNum();
		System.out.println("10个随机值:" + nums);
		ArrayList maxList = getTop3(nums);
		System.out.println("前3个最大的:" + maxList);
		
		System.out.println("删除后:" + nums);
	}

	public static ArrayList getNum() {
		ArrayList list = new ArrayList();
		Random r = new Random();
		for (int i = 0; i < 10; i++) {
			int n = r.nextInt(100) + 1;
			list.add(n);
		}
		return list;
	}
	
	public static ArrayList getTop3(ArrayList list){
		ArrayList maxList = new ArrayList();
		for (int i = 0; i < 3; i++) {
			Integer max = (Integer) list.get(0);
			for (int j = 0; j < list.size(); j++) {
				Integer num = (Integer) list.get(j);
				if(max < num){
					max = num;
				}
				
			}
			maxList.add(max);
			
			while(list.contains(max)){
				list.remove(max);
			}
		}
		
		return maxList;
	}
	
}

6、随机质数

  • 随机生成30个数,范围2-100,获取其中的质数。
  • 代码实现,效果如图所示:

在这里插入图片描述

开发提示:

  • 质数:在一个大于1的整数中,除了1和此整数自身外,没法被其他自然数整除的数。
@SuppressWarnings("all")
public class Exercise6 {
    public static void main(String[] args) {
        ArrayList ranNum = getRanNum();
        System.out.println("随机数为:");
        System.out.println(ranNum);
        System.out.println("其中的质数为:");
        ArrayList pNum = getPNum(ranNum);
        System.out.println(pNum);
    }

    public static  ArrayList  getPNum(ArrayList  ranNum){
        ArrayList list = new ArrayList();

        for (int i = 0; i < ranNum.size(); i++) {
            Integer integer = (Integer) ranNum.get(i);
            if (isP(integer)){
                list.add(integer);
            }
        }
        return list;
    }

    public static  ArrayList  getRanNum(){
        Random random = new Random();
        ArrayList list = new ArrayList();
        for (int i = 0; i < 30; i++) {
            list.add(random.nextInt(99)+2);
        }
        return list;
    }

    public static boolean isP(int n){
        boolean isPrime = true;
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}

7、统计元素次数

案例:

? 1、请定义方法public static int listTest(Collection list,String s)统计集合中指定元素出现的次数

? 2、创建集合,集合存放随机生成的30个小写字母

? 3、用listTest统计,a、b、c、x元素的出现次数

? 4、效果如下

在这里插入图片描述

@SuppressWarnings("all")
public class Exercise7 {
	public static void main(String[] args) {
		Collection list = new ArrayList();
		Random rand = new Random();
		for (int i = 0; i < 30; i++) {
			list.add((char)(rand.nextInt(26)+97)+"");
		}
		System.out.println(list);
		System.out.println("a:"+listTest(list, "a"));	
		System.out.println("b:"+listTest(list, "b"));	
		System.out.println("c:"+listTest(list, "c"));
		System.out.println("x:"+listTest(list, "x"));	
	}

	public static int listTest(Collection list, String string) {
		int count = 0;
		for (Object object : list) {
			if(string.equals(object)){
				count++;
			}
		}
		return count;
	}
}

8、质数与随机数

(1)创建一个Collection集合primeNumbers(暂时new ArrayList())

(2)添加100以内的质数到primeNumbers集合中

质数是大于1的自然数,并且只能被1和它本身整除。

(3)查看100以内的质数个数有几个

(4)使用foreach遍历primeNumbers集合中的所有质数。

(5)使用Iterator迭代器删除个位数是3的质数。

(6)判断primeNumbers集合中是否有11,如果有请使用Collection集合的remove方法删除11

(7)使用Collection集合的removeIf方法删除个位数是7的质数。

(8)再次使用Iterator遍历primeNumbers集合中剩下的质数。

(9)创建另一个Collection集合randNumbers

(10)添加10个100以内的随机整数到randNumbers集合中

(11)使用foreach遍历randNumbers集合中的随机数。

(12)求它们的交集

public class Exercise8 {
    public static void main(String[] args) {
        Collection primeNumbers = new ArrayList();

        for (int i = 2; i <100 ; i++) {
            boolean flag = true;
            for (int j=2; j<=Math.sqrt(i); j++){
                if(i%j==0){
                    flag = false;
                    break;
                }
            }
            if(flag){
                primeNumbers.add(i);
            }
        }
        System.out.println("100以内的质数个数有" + primeNumbers.size() + "个");
        System.out.println("100以内的质数有:");
        for (Object primeNumber : primeNumbers) {
            System.out.print(primeNumber+",");
        }
        System.out.println();

        Iterator iterator = primeNumbers.iterator();
        while(iterator.hasNext()){
            Integer number = (Integer) iterator.next();
            if(number % 10 == 3){
                iterator.remove();
            }
        }

        if(primeNumbers.contains(11)){
            primeNumbers.remove(11);
        }

        primeNumbers.removeIf(new Predicate() {
            @Override
            public boolean test(Object o) {
                return ((Integer) o) % 10 == 7;
            }
        });

        System.out.println("primeNumbers还剩下:");
        iterator = primeNumbers.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+",");
        }
        System.out.println();

        Collection randNumbers = new ArrayList();
        Random random = new Random();
        for(int i=1; i<=10; i++){
            randNumbers.add(random.nextInt(100));
        }
        System.out.println("randNumbers集合中有:");
        for (Object randNumber : randNumbers) {
            System.out.print(randNumber + ",");
        }
        System.out.println();

        primeNumbers.retainAll(randNumbers);
        System.out.println("它们的交集是:" + primeNumbers);
    }
}

9、学生对象

(1)声明学员类型Student,包含属性:学号,姓名,年龄,属性私有化,提供有参构造,get/set,重写toString

(2)创建Collection集合students(暂时new ArrayList())

(3)添加本组学员Student对象到students集合中

(4)使用foreach遍历

(5)使用Collection的remove方法删除自己,思考这样是否可以删除,如果不能,怎么办

students.remove(new Student(自己的学号,"自己的姓名",自己的年龄));

(6)使用Collection的removeIf方法删除和自己年龄一样的组员

(7)使用Iterator遍历,并根据组长姓名删除组长

(8)最后再次使用foreach遍历students集合

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

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

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

    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 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Exercise9 {
    public static void main(String[] args) {
        Collection students = new ArrayList();
        students.add(new Student(1,"宋红康",35));
        students.add(new Student(2,"宋橙康",33));
        students.add(new Student(3,"宋黄康",28));
        students.add(new Student(4,"宋绿康",35));
        students.add(new Student(5,"宋青康",33));
        students.add(new Student(6,"宋蓝康",36));
        students.add(new Student(7,"宋紫康",35));

        System.out.println("本组学员有:");
        for (Object student : students) {
            System.out.println(student);
        }

        //删除自己
        students.remove(new Student(4,"宋绿康",35));

        //删除和自己年龄一样的学员
        students.removeIf(new Predicate() {
            @Override
            public boolean test(Object o) {
                return ((Student)o).getAge() == 35;
            }
        });

        //删除组长
        Iterator iterator = students.iterator();
        while(iterator.hasNext()){
            Student student = (Student) iterator.next();
            if(student.getName().equals("宋红康")){
                iterator.remove();
            }
        }

        System.out.println("本组学员还有:");
        for (Object student : students) {
            System.out.println(student);
        }

    }
}

HashSet

10、字符串去重

案例:键盘录入一个字符串,去掉其中重复字符,打印出不同的那些字符,必须保证顺序。例如输入:aaaabbbcccddd,打印结果为:abcd。效果如图:

在这里插入图片描述

提示:LinkedHashSet的使用

@SuppressWarnings("all")
public class Exercise10 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.print("请输入一串字母:");
		String str = input.nextLine();
		System.out.println("str=" + str);
		
		LinkedHashSet set = new LinkedHashSet();
		for (int i = 0; i < str.length(); i++) {
			set.add(str.charAt(i));
		}
		
		System.out.print("去重后:");
		String result = "";
		for (Object object : set) {
			result += object;
		}
		System.out.println(result);
	}
}

TreeSet

11、双色球

案例:双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择;请随机生成一注双色球号码。(要求同色号码不重复)

在这里插入图片描述

开发提示:可以使用TreeSet和ArrayList结合

@SuppressWarnings("all")
public class Exercise11 {
	public static void main(String[] args) {
		TreeSet red = new TreeSet();
		Random rand = new Random();
		while(red.size()<6){
			red.add(rand.nextInt(33)+1);
		}
		ArrayList list = new ArrayList();
		list.addAll(red);
		list.add(rand.nextInt(16)+1);//蓝色号码
		System.out.println("双色球所有号码:" + list);
		
		System.out.print("红色号码:");
		for (int i = 0; i < list.size()-1; i++) {
			System.out.print(list.get(i)+" ");
		}
		System.out.println("蓝色号码:" + list.get(list.size()-1));
	}
}

12、学生排序

案例:有如下四个学生的成绩:

在这里插入图片描述

(1)用Comparable接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。

(2)用Comparator实现按照姓名排序

(3)效果如下

在这里插入图片描述

@SuppressWarnings("all")
public class Exercise12 {
	public static void main(String[] args) {
		System.out.println("按照成绩和年龄排序:");
		TreeSet set = new TreeSet();
		set.add(new Student("liusan",20,90.0));
		set.add(new Student("lisi",22,90.0));
		set.add(new Student("wangwu",20,99.0));
		set.add(new Student("sunliu",22,100.0));
		for (Object object : set) {
			System.out.println(object);
		}
		
		System.out.println("按照姓名排序:");
		TreeSet all = new TreeSet(new Comparator() {

			@Override
			public int compare(Object o1, Object o2) {
				Student s1 = (Student) o1;
				Student s2 = (Student) o2;
				return s1.getName().compareTo(s2.getName());
			}
		});
		for (Object object : set) {
			all.add(object);
		}
		for (Object object : all) {
			System.out.println(object);
		}
	}
}
class Student implements Comparable{
	private String name;
	private int age;
	private double score;
	public Student(String name, int age, double score) {
		super();
		this.name = name;
		this.age = age;
		this.score = score;
	}
	public Student() {
		super();
	}
	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;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
	}
	@Override
	public int compareTo(Object o) {
		Student stu = (Student) o;
		if(this.getScore()>stu.getScore()){
			return -1;
		}else if(this.getScore() < stu.getScore()){
			return 1;
		}
		return this.getAge() - stu.getAge();
	}
	
}

HashMap

13、统计字母次数

一个字符串,包含了空格等标点符号,写一个函数计算出出现次数最多的字母和该字母出现的次数。

开发提示:可以使用Map,key是字母,value是该字母的次数

效果演示:例如:String str = “Your future depends on your dreams, so go to sleep.”;

在这里插入图片描述

public class Exercise13 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		String str = "Your future depends on your dreams, so go to sleep.";
		str = str.replaceAll("[^a-zA-Z]", "");
		HashMap map = new HashMap();
		char[] arr = str.toCharArray();
		for (int i = 0; i < arr.length; i++) {
			if(map.containsKey(arr[i])){
				Integer count = (Integer) map.get(arr[i]);
				map.put(arr[i], count+1);
			}else{
				map.put(arr[i], 1);
			}
		}
		
		Set entrySet = map.entrySet();
		for (Object object : entrySet) {
			System.out.println(object);
		}
	}
}

14、歌手与歌曲

案例:添加你喜欢的歌手以及你喜欢他唱过的歌曲

例如:

在这里插入图片描述

public class Exercise14 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		HashMap map = new HashMap();
		
		ArrayList wangfei = new ArrayList();
		wangfei.add("《红豆》");
		wangfei.add("《传奇》");
		wangfei.add("《容易受伤的女人》");
		map.put("王菲", wangfei);
		
		
		ArrayList zxy = new ArrayList();
		zxy.add("《一路上有你》");
		zxy.add("《吻别》");
		zxy.add("《一千个伤心的理由》");
		map.put("张学友", zxy);
		
		Set entrySet = map.entrySet();
		for (Object object : entrySet) {
			System.out.println(object);
		}
	}
}

15、省份与城市信息

添加如下省份与城市信息到map中,并遍历显示

浙江省
	绍兴市
	温州市
	湖州市
	嘉兴市
	台州市
	金华市
	舟山市
	衢州市
	丽水市
	杭州市
	宁波市
海南省
	海口市
	三亚市
北京市
	北京市

开发提示:

? 其中key为省份名,value为该省份所有的市辖区

public class Exercise15 {
	@SuppressWarnings("all")
	public static void main(String[] args) throws Exception {
		HashMap map = new HashMap();
		map.put("北京市", Arrays.asList("北京市"));
		map.put("海南省", Arrays.asList("海口市","三亚市"));
		map.put("浙江省", Arrays.asList("绍兴市","温州市","湖州市","嘉兴市","台州市","金华市","舟山市","衢州市","丽水市"));
	
		Set entrySet = map.entrySet();
		for (Object object : entrySet) {
			System.out.println(object);
		}
	}
}

16、世界杯冠军

案例:

(1)从键盘输入一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。

(2)从键盘输入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯

运行效果如下:

在这里插入图片描述

开发提示:

把年份作为key,改年夺冠的国家名称作为value存到map中

附:历届世界杯冠军

届数举办年份举办地点冠军
第一届1930年乌拉圭乌拉圭
第二届1934年意大利意大利
第三届1938年法国意大利
第四届1950年巴西乌拉圭
第五届1954年瑞士西德
第六届1958年瑞典巴西
第七届1962年智利巴西
第八届1966年英格兰英格兰
第九届1970年墨西哥巴西
第十届1974年前西德西德
第十一届1978年阿根廷阿根廷
第十二届1982年西班牙意大利
第十三届1986年墨西哥阿根廷
第十四届1990年意大利西德
第十五届1994年美国巴西
第十六届1998年法国法国
第十七届2002年韩日巴西
第十八届2006年德国意大利
第十九届2010年南非西班牙
第二十届2014年巴西德国
第二十一届2018年俄罗斯法国
public class Exercise16 {
	@SuppressWarnings("all")
	public static void main(String[] args) {

		Map m = new HashMap();

		m.put(1930, "乌拉圭");
		m.put(1934, "意大利");
		m.put(1938, "意大利");
		m.put(1950, "乌拉圭");
		m.put(1954, "西德");
		m.put(1958, "巴西");
		m.put(1962, "巴西");
		m.put(1966, "英格兰");
		m.put(1970, "巴西");
		m.put(1974, "西德");
		m.put(1978, "阿根廷");
		m.put(1982, "意大利");
		m.put(1986, "阿根廷");
		m.put(1990, "西德");
		m.put(1994, "巴西");
		m.put(1998, "法国");
		m.put(2002, "巴西");
		m.put(2006, "意大利");
		m.put(2010, "西班牙");
		m.put(2014, "德国");
		m.put(2018, "法国");

		Scanner input = new Scanner(System.in);
		System.out.print("请输入一个年份:");
		int key = input.nextInt();

		if (m.containsKey(key)) {
			System.out.println(key + "年,获得世界杯冠军的是:" + m.get(key));
		} else {
			System.out.println("该年没有举办世界杯!");
		}

		System.out.print("请输入一个国家名称:");
		String country = input.next();

		if (m.containsValue(country)) {
			System.out.println("该国球队在如下年份获得过冠军:");
			for (Object year : m.keySet()) {
				if (m.get(year).equals(country)) {
					System.out.println(year);
				}
			}
		} else {
			System.out.println("该国家没有获得世界杯冠军");
		}

	}
}

综合

17、斗地主-1

案例:模拟斗地主洗牌和发牌并对牌进行排序的代码实现

运行效果如下:

在这里插入图片描述

开发提示:

? (1)用String[] nums = { “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”, “J”, “Q”, “K”, “A”, “2” };存储数字

? String[] colors = { “方片”, “梅花”, “红桃”, “黑桃” };存储花色

? (2)单独处理大王、小王

? (3)将54张牌的索引[1,54]数字依次存储到一个ArrayList中

? (4)用nums和colors数组的组合,将54张牌存储的一个Map中,key是索引,范围是1-54,value是牌面,例如:(1,黑桃3),…(54,小王)

? (5)对ArrayList进行洗牌打乱顺序

? (6)依次取list中的索引,发给四位牌友,四位牌友的牌可以用TreeSet存储,这样可以按照索引大小排序,索引大小就是牌的大小

? (7)遍历结果,TreeSet中存储的是牌的索引,显示的时候从Map中取出牌显示

public class Exercise17 {

	@SuppressWarnings("all")
	public static void main(String[] args) {
		String[] nums = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
		String[] colors = { "方片", "梅花", "红桃", "黑桃" };
		
		ArrayList list = new ArrayList(); // 存储54章牌的索引[0,53]
		HashMap map = new HashMap(); // 存储索引和扑克牌
		int index = 1; // 索引的开始值
		for (String num : nums) {
			for (String color : colors) {
				map.put(index, color.concat(num)); // 将索引和扑克牌添加到HashMap中
				list.add(index); // 将索引添加到ArrayList集合中
				index++;
			}
		}
		map.put(index, "小王");
		list.add(index);
		index++;
		map.put(index, "大王");
		list.add(index);
		// 洗牌
		Collections.shuffle(list);
		// 发牌
		TreeSet left = new TreeSet();
		TreeSet right = new TreeSet();
		TreeSet me = new TreeSet();
		TreeSet up = new TreeSet();
		TreeSet lastCards = new TreeSet();
		for (int i = 0; i < 13; i++) {
			right.add(list.remove(0));
			left.add(list.remove(0));
			me.add(list.remove(0));
			up.add(list.remove(0));
		}
		lastCards.addAll(list);

		// 看牌
		lookPoker("左边玩家", left, map);
		lookPoker("右边玩家", right, map);
		lookPoker("上边玩家", up, map);
		lookPoker("我", me, map);
		lookPoker("底牌", lastCards, map);
}

	public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> map) {
		System.out.println(name + "的牌是:");
		for (Integer index : ts) {
			System.out.print(map.get(index) + " ");
		}

		System.out.println();
	}
}

18、斗地主-2

1. 实现效果

按照斗地主的规则,完成洗牌发牌的动作。

2. 实现步骤

  1. 生成牌:生成54张扑克牌。使用LinkedHashMap,完成一个数字与字符串纸牌的对应关系
  2. 洗牌:对54张牌进行随机排序。
  3. 发牌:三个玩家参与游戏并交替摸牌,最后三张留作底牌。使用ArrayList存储各个玩家及底牌的牌。
  4. 看牌:查看三人各自手中的牌(按照牌的大小排序)、底牌。

规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

3. 实现代码步骤

public class Exercise18 {
	public static void main(String[] args) {
		LinkedHashMap<Integer, String> poker = new LinkedHashMap<>();
		ArrayList<Integer> pkIndex = new ArrayList<>(); 
		int index = 0;

		String[] colors = { "?", "?", "?", "?" };
		String[] numbers = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };

		pkIndex.add(index);
		poker.put(index, "大王");
		index++;
		pkIndex.add(index);
		poker.put(index, "小王");
		index++;

		for (int i = 0; i < numbers.length; i++) {
			for (int j = 0; j < colors.length; j++) {
				pkIndex.add(index);
				poker.put(index, colors[j] + numbers[i]);
				index++;
				//System.out.println(colors[j] + numbers[i]);
			}
		}
		
		Collections.shuffle(pkIndex);
		
		ArrayList<Integer> player01 = new ArrayList<>();
        ArrayList<Integer> player02 = new ArrayList<>();
        ArrayList<Integer> player03 = new ArrayList<>();
        ArrayList<Integer> diPai = new ArrayList<>();
        
        
        for (int i = 0; i <pkIndex.size() ; i++) {
            Integer in = pkIndex.get(i);
            //先判断底牌
            if(i>=51){
                //给底牌发牌
                diPai.add(in);
            }else if(i%3==0){
                //给玩家1发牌
                player01.add(in);
            }else if(i%3==1){
                //给玩家2发牌
                player02.add(in);
            }else if(i%3==2){
                //给玩家3发牌
                player03.add(in);
            }
        }
		
        lookPoker("玩家1", poker, player01);
        lookPoker("玩家2", poker, player02);
        lookPoker("玩家3", poker, player03);
        lookPoker("底牌", poker, diPai);

	}
	
	public static void lookPoker (String name,HashMap<Integer,String> poker,ArrayList<Integer> list) {
		Collections.sort(list);
        System.out.print(name + ":");
        for (int i = 0; i < list.size(); i++) {
			int playerIndex = list.get(i);
			String player = poker.get(playerIndex);
			if (i == list.size() -1 ) {
				System.out.println(player);
			} else {
				System.out.print(player+",");
			}
		}
	}
}

19、省市联动

案例:模拟菜单的二级联动效果

现有全国各省市信息字符串如下:

		String str = "'北京': ['北京'];"
				+"'上海': ['上海'];"
				+"'天津': ['天津'];"
				+"'重庆': ['重庆'];"
				+"'河北省': ['石家庄', '张家口', '承德', '秦皇岛', '唐山', '廊坊', '保定', '沧州', '衡水', '邢台', '邯郸'];"
				+"'山西省': ['太原', '大同', '朔州', '阳泉', '长治', '晋城', '忻州', '吕梁', '晋中', '临汾', '运城'];"
				+"'辽宁省': ['沈阳', '朝阳', '阜新', '铁岭', '抚顺', '本溪', '辽阳', '鞍山', '丹东', '大连', '营口', '盘锦', '锦州', '葫芦岛'];"
				+"'吉林省': ['长春', '白城', '松原', '吉林', '四平', '辽源', '通化', '白山', '延边'];"
				+"'黑龙江省': ['哈尔滨', '齐齐哈尔', '黑河', '大庆', '伊春', '鹤岗', '佳木斯', '双鸭山', '七台河', '鸡西', '牡丹江', '绥化', '大兴安'];"
				+"'江苏省': ['南京', '徐州', '连云港', '宿迁', '淮阴', '盐城', '扬州', '泰州', '南通', '镇江', '常州', '无锡', '苏州'];"
				+"'浙江省': ['杭州', '湖州', '嘉兴', '舟山', '宁波', '绍兴', '金华', '台州', '温州', '丽水','衢州'];"
				+"'安徽省': ['合肥', '宿州', '淮北', '阜阳', '蚌埠', '淮南', '滁州', '马鞍山', '芜湖', '铜陵', '安庆', '黄山', '六安', '巢湖', '池州', '宣城'];"
				+"'福建省': ['福州', '南平', '三明', '莆田', '泉州', '厦门', '漳州', '龙岩', '宁德'];"
				+"'江西省': ['南昌', '九江', '景德镇', '鹰潭', '新余', '萍乡', '赣州', '上饶', '抚州', '宜春', '吉安'];"
				+"'山东省': ['济南', '聊城', '德州', '东营', '淄博', '潍坊', '烟台', '威海', '青岛', '日照', '临沂', '枣庄', '济宁', '泰安', '莱芜', '滨州', '菏泽'];"
				+"'河南省': ['郑州', '三门峡', '洛阳', '焦作', '新乡', '鹤壁', '安阳', '濮阳', '开封', '商丘', '许昌', '漯河', '平顶山', '南阳', '信阳', '周口', '驻马店'];"
				+"'湖北省': ['武汉', '十堰', '襄攀', '荆门', '孝感', '黄冈', '鄂州', '黄石', '咸宁', '荆州', '宜昌', '恩施', '襄樊'];"
				+"'湖南省': ['长沙', '张家界', '常德', '益阳', '岳阳', '株洲', '湘潭', '衡阳', '郴州', '永州', '邵阳', '怀化', '娄底', '湘西'];"
				+"'广东省': ['广州', '清远', '韶关', '河源', '梅州', '潮州', '汕头', '揭阳', '汕尾', '惠州', '东莞', '深圳', '珠海', '江门', '佛山', '肇庆', '云浮', '阳江', '茂名', '湛江'];"
				+"'海南省': ['海口', '三亚'];"
				+"'四川省': ['成都', '广元', '绵阳', '德阳', '南充', '广安', '遂宁', '内江', '乐山', '自贡', '泸州', '宜宾', '攀枝花', '巴中', '达川', '资阳', '眉山', '雅安', '阿坝', '甘孜', '凉山'];"
				+"'贵州省': ['贵阳', '六盘水', '遵义', '毕节', '铜仁', '安顺', '黔东南', '黔南', '黔西南'];"
				+"'云南省': ['昆明', '曲靖', '玉溪', '丽江', '昭通', '思茅', '临沧', '保山', '德宏', '怒江', '迪庆', '大理', '楚雄', '红河', '文山', '西双版纳'];"
				+"'陕西省': ['西安', '延安', '铜川', '渭南', '咸阳', '宝鸡', '汉中', '榆林', '商洛', '安康'];"
				+"'甘肃省': ['兰州', '嘉峪关', '金昌', '白银', '天水', '酒泉', '张掖', '武威', '庆阳', '平凉', '定西', '陇南', '临夏', '甘南'];"
				+"'青海省': ['西宁', '海东', '西宁', '海北', '海南', '黄南', '果洛', '玉树', '海西'];"
				+"'内蒙古': ['呼和浩特', '包头', '乌海', '赤峰', '呼伦贝尔盟', '兴安盟', '哲里木盟', '锡林郭勒盟', '乌兰察布盟', '鄂尔多斯', '巴彦淖尔盟', '阿拉善盟'];"
				+"'广西': ['南宁', '桂林', '柳州', '梧州', '贵港', '玉林', '钦州', '北海', '防城港', '南宁', '百色', '河池', '柳州', '贺州'];"
				+"'西藏': ['拉萨', '那曲', '昌都', '林芝', '山南', '日喀则', '阿里'];"
				+"'宁夏': ['银川', '石嘴山', '吴忠', '固原'];"
				+"'新疆': ['乌鲁木齐', '克拉玛依', '喀什', '阿克苏', '和田', '吐鲁番', '哈密', '博尔塔拉', '昌吉', '巴音郭楞', '伊犁', '塔城', '阿勒泰'];"
				+"'香港': ['香港'];"
				+"'澳门': ['澳门'];"
				+"'台湾': ['台北', '台南', '其他']";

效果如下:

请选择:
1:北京
2:上海
3:天津
4:重庆
5:河北省
6:山西省
7:辽宁省
8:吉林省
9:黑龙江省
10:江苏省
11:浙江省
12:安徽省
13:福建省
14:江西省
15:山东省
16:河南省
17:湖北省
18:湖南省
19:广东省
20:海南省
21:四川省
22:贵州省
23:云南省
24:陕西省
25:甘肃省
26:青海省
27:内蒙古
28:广西
29:西藏
30:宁夏
31:新疆
32:香港
33:澳门
34:台湾
省份:11
该省份共有辖区:[杭州, 湖州, 嘉兴, 舟山, 宁波, 绍兴, 金华, 台州, 温州, 丽水, 衢州]

开发提示:

(1)把字符串str字符串先按照;进行拆分,得到34个省(包括23个省,5个自治区,4个直辖市,2个特别行政区,下面的题目描述中,把它们都成为省份)

(2)然后把每个省的字符串,按照:进行拆分,那么:左边的是省份名称,:右边的是该省的各市辖区

(3)把34个省存储到一个HashMap集合中,其中编号是key,省份名是value

(4)把所有省份的城市存储到一个LinkedHashMap集合中,其中省份名是key,该省份的所有城市用一个ArrayList的集合装起来,然后作为value。

(5)注意,字符串处理过程中,注意:[、]、,、'等标点符号的处理

例如:

去掉单引号'
replace("'", "")

去掉[,],',空格
replaceAll("\\[|\\]|\\'| ", "")
public class Exercise19 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		LinkedHashMap all = new LinkedHashMap();
		HashMap allProvinces = new HashMap();
		String str = "'北京': ['北京'];"
				+"'上海': ['上海'];"
				+"'天津': ['天津'];"
				+"'重庆': ['重庆'];"
				+"'河北省': ['石家庄', '张家口', '承德', '秦皇岛', '唐山', '廊坊', '保定', '沧州', '衡水', '邢台', '邯郸'];"
				+"'山西省': ['太原', '大同', '朔州', '阳泉', '长治', '晋城', '忻州', '吕梁', '晋中', '临汾', '运城'];"
				+"'辽宁省': ['沈阳', '朝阳', '阜新', '铁岭', '抚顺', '本溪', '辽阳', '鞍山', '丹东', '大连', '营口', '盘锦', '锦州', '葫芦岛'];"
				+"'吉林省': ['长春', '白城', '松原', '吉林', '四平', '辽源', '通化', '白山', '延边'];"
				+"'黑龙江省': ['哈尔滨', '齐齐哈尔', '黑河', '大庆', '伊春', '鹤岗', '佳木斯', '双鸭山', '七台河', '鸡西', '牡丹江', '绥化', '大兴安'];"
				+"'江苏省': ['南京', '徐州', '连云港', '宿迁', '淮阴', '盐城', '扬州', '泰州', '南通', '镇江', '常州', '无锡', '苏州'];"
				+"'浙江省': ['杭州', '湖州', '嘉兴', '舟山', '宁波', '绍兴', '金华', '台州', '温州', '丽水','衢州'];"
				+"'安徽省': ['合肥', '宿州', '淮北', '阜阳', '蚌埠', '淮南', '滁州', '马鞍山', '芜湖', '铜陵', '安庆', '黄山', '六安', '巢湖', '池州', '宣城'];"
				+"'福建省': ['福州', '南平', '三明', '莆田', '泉州', '厦门', '漳州', '龙岩', '宁德'];"
				+"'江西省': ['南昌', '九江', '景德镇', '鹰潭', '新余', '萍乡', '赣州', '上饶', '抚州', '宜春', '吉安'];"
				+"'山东省': ['济南', '聊城', '德州', '东营', '淄博', '潍坊', '烟台', '威海', '青岛', '日照', '临沂', '枣庄', '济宁', '泰安', '莱芜', '滨州', '菏泽'];"
				+"'河南省': ['郑州', '三门峡', '洛阳', '焦作', '新乡', '鹤壁', '安阳', '濮阳', '开封', '商丘', '许昌', '漯河', '平顶山', '南阳', '信阳', '周口', '驻马店'];"
				+"'湖北省': ['武汉', '十堰', '襄攀', '荆门', '孝感', '黄冈', '鄂州', '黄石', '咸宁', '荆州', '宜昌', '恩施', '襄樊'];"
				+"'湖南省': ['长沙', '张家界', '常德', '益阳', '岳阳', '株洲', '湘潭', '衡阳', '郴州', '永州', '邵阳', '怀化', '娄底', '湘西'];"
				+"'广东省': ['广州', '清远', '韶关', '河源', '梅州', '潮州', '汕头', '揭阳', '汕尾', '惠州', '东莞', '深圳', '珠海', '江门', '佛山', '肇庆', '云浮', '阳江', '茂名', '湛江'];"
				+"'海南省': ['海口', '三亚'];"
				+"'四川省': ['成都', '广元', '绵阳', '德阳', '南充', '广安', '遂宁', '内江', '乐山', '自贡', '泸州', '宜宾', '攀枝花', '巴中', '达川', '资阳', '眉山', '雅安', '阿坝', '甘孜', '凉山'];"
				+"'贵州省': ['贵阳', '六盘水', '遵义', '毕节', '铜仁', '安顺', '黔东南', '黔南', '黔西南'];"
				+"'云南省': ['昆明', '曲靖', '玉溪', '丽江', '昭通', '思茅', '临沧', '保山', '德宏', '怒江', '迪庆', '大理', '楚雄', '红河', '文山', '西双版纳'];"
				+"'陕西省': ['西安', '延安', '铜川', '渭南', '咸阳', '宝鸡', '汉中', '榆林', '商洛', '安康'];"
				+"'甘肃省': ['兰州', '嘉峪关', '金昌', '白银', '天水', '酒泉', '张掖', '武威', '庆阳', '平凉', '定西', '陇南', '临夏', '甘南'];"
				+"'青海省': ['西宁', '海东', '西宁', '海北', '海南', '黄南', '果洛', '玉树', '海西'];"
				+"'内蒙古': ['呼和浩特', '包头', '乌海', '赤峰', '呼伦贝尔盟', '兴安盟', '哲里木盟', '锡林郭勒盟', '乌兰察布盟', '鄂尔多斯', '巴彦淖尔盟', '阿拉善盟'];"
				+"'广西': ['南宁', '桂林', '柳州', '梧州', '贵港', '玉林', '钦州', '北海', '防城港', '南宁', '百色', '河池', '柳州', '贺州'];"
				+"'西藏': ['拉萨', '那曲', '昌都', '林芝', '山南', '日喀则', '阿里'];"
				+"'宁夏': ['银川', '石嘴山', '吴忠', '固原'];"
				+"'新疆': ['乌鲁木齐', '克拉玛依', '喀什', '阿克苏', '和田', '吐鲁番', '哈密', '博尔塔拉', '昌吉', '巴音郭楞', '伊犁', '塔城', '阿勒泰'];"
				+"'香港': ['香港'];"
				+"'澳门': ['澳门'];"
				+"'台湾': ['台北', '台南', '其他']";
		
		String[] provincesStr = str.split(";");
		for (int i = 0; i < provincesStr.length; i++) {
			String[] split = provincesStr[i].split(":");
			String proviceName = split[0].replace("'", "");
			allProvinces.put(i+1, proviceName);
			
			ArrayList cityList = new ArrayList();
			String[] cityStrings = split[1].replaceAll("\\[|\\]|\\'| ", "").split(",");
			for (int j = 0; j < cityStrings.length; j++) {
				cityList.add(cityStrings[j]);
			}
			all.put(proviceName, cityList);
		}
		
		Scanner input = new Scanner(System.in);
		System.out.println("请选择:");
		Set entrySet = allProvinces.entrySet();
		for (Object object : entrySet) {
			System.out.println(object); 
		}
		System.out.print("省份:");
		int select = input.nextInt();
		System.out.println("该省份共有辖区:" + all.get(allProvinces.get(select)));
	}
}

文章来源:https://blog.csdn.net/m0_65152767/article/details/135642567
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。