少壮不努力,老大徒伤悲!

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


ArrayList

1、随机验证码

  • 随机验证码。

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

    1559813820285

  • 开发提示:

    • 使用字符数组保存原始字符,利用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遍历集合。

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

    1559890098509

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、显示每个人的牌和剩余的牌

​ 效果如下:

1559892993381

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,不能重复。
    • 录入的整数与乐透号码对比,统计猜中了几个。
  • 代码实现,效果如图所示:

    1559893557618

开发提示:

  • 当使用集合时,可以通过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、显示删除后的结果

​ 效果如下:

1559895182885

@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,获取其中的质数。
  • 代码实现,效果如图所示:

1559895216249

开发提示:

  • 质数:在一个大于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、效果如下

1559896150606

@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。效果如图:

1559896520589

提示: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中选择;请随机生成一注双色球号码。(要求同色号码不重复)

1559896882586

开发提示:可以使用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、学生排序

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

1559896951791

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

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

(3)效果如下

1559897415432

@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.”;

1560042043311

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、歌手与歌曲

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

例如:

1560042024295

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 读入“荷兰”,应当输出 没有获得过世界杯

运行效果如下:

1560052731332

开发提示:

把年份作为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

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

运行效果如下:

1560050593393

开发提示:

​ (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. 实现效果

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

image-20220511105958654

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)));
	}
}

版权声明:如无特别声明,本站收集的文章归  HuaJi66/Others  所有。 如有侵权,请联系删除。

联系邮箱: GenshinTimeStamp@outlook.com

本文标题:《 练习-第12章_集合框架.md 》

本文链接:/java/%E7%BB%83%E4%B9%A0%E9%A2%98/%E7%AC%AC12%E7%AB%A0_%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6.html