使用集合的嵌套实现需求—工具eclipse

需求

用控制台输出以下结果:

班级:三班

  •     姓名       学号
    
  •     张三      1301
    
  •     李四      1302 	
    

班级:四班

  •     姓名       学号
    
  •     王三      1401
    
  •     王三      1402
    

分析题目

题中有两个班级,且班级中有两种信息,姓名和学号,且都是String类型(得显示姓名、学号这个标题);比较特殊的是,四班中有两个学生的名字相同,学号不同。

  • 在创建集合的时候,不能单独使用ArrayList集合类型实现因为它是单引用数据类型,可以使用HashMap<String,String>类型,但是使用这个方法很难保证元素的统一性,为了可以避免名字相同而不显示输出; 要重写HashCode()和equals方法才行,但是这样会添加一些题外因素才可以实现原题要求。

方法讨论

方法一:
创建下面集合:

HashMap<String,HashMap<String,String>>  hash = new HashMap<String,HashMap<String,String>>();

上面这种嵌套集合,看似没有问题符合题意要求,但是到四班(姓名王三,学号1401)同学的时候,他的信息就会被姓名王三,学号1402同学覆盖,所以这个方法不行。

方法二:
创建下面集合:

HashMap<String,HashMap<String,ArrayList<Student>>>  hash = new HashMap<String,HashMap<String,ArrayList<Student>>>();

这种嵌套集合改变了题意,虽然符合显示 班级:四班 、姓名、学号,但是增加一个键,就要添加一种不重复的属性(比如序号),所以这种方法也不可取,但是可以在这种方法上改进。
方法三:
创建下面集合:

HashMap<String,ArrayList<Student>>  hash = new HashMap<String,ArrayList<Student>>();

这种方法可以有效解决名字相同的同学问题,但是需要创建一个学生类型,要有学生的姓名属性和学生学号的属性,Student要做好泛型的一个类型,才可以实现本题。

创建学生类型—Student

package com.boke;

//创建一个学生类
public class Student {
	
	private String name ;       //学生名字
	private String number ;     //学生学号
	
	
	//无参+有参
	public Student() {
		super();
		
	}
	public Student(String name, String number) {
		super();
		this.name = name;
		this.number = number;
	}
	
	
	//ste()+get()方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	
	
}

创建测试类—Test

package com.boke;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		
		//创建一个大的集合
		HashMap<String,ArrayList<Student>>  hash = new HashMap<String,ArrayList<Student>>();
		
		//创建第一个ArrayList<Student>集合,装三班信息
		ArrayList<Student>  array1 = new ArrayList<Student>();
		Student s  = new Student("学生","学号");
		Student s1 = new Student("张三","1301");
		Student s2 = new Student("李四","1302");
		//将这些信息装进ArrayList<Student>集合中
		array1.add(s);
		array1.add(s1);
		array1.add(s2);
		//将三班这个信息装机大集合中
		hash.put("班级:三班", array1);

		
		
		//创建第二个ArrayList<Student>集合,装四班信息
		ArrayList<Student>  array2 = new ArrayList<Student>();
		Student st  = new Student("学生","学号");
		Student st1 = new Student("王三","1401");
		Student st2 = new Student("王三","1402");
		//将这些信息装进ArrayList<Student>集合中
		array2.add(st);
		array2.add(st1);
		array2.add(st2);
		//将三班这个信息装机大集合中
		hash.put("班级:四班", array2);		
		

		
		

		//通过集合获取键
		Set<String> jian = hash.keySet();
		
		//遍历HashMap<String,ArrayList<Student>>大集合
		for(String jianMing : jian) {
			
			//输出键名
			System.out.println( jianMing );
			
			//通过键获取值,这步可以省略因为小集合中是ArrayList集合,不能使用增强for循坏
			//ArrayList<Student> zhiMing = hash.get( jian );
			
			
			//遍历ArrayList<Student>小集合
			if( jianMing == "班级:三班" ) {
				for(int x=0 ; x<array1.size(); x++) {
					Student b1 = array1.get(x);
					System.out.println("\t"+b1.getName()+"---"+b1.getNumber());
				}
			}else if(  jianMing == "班级:四班" ) {
				for(int x=0 ; x<array2.size(); x++) {
					Student b2 = array2.get(x);
					System.out.println("\t"+b2.getName()+"---"+b2.getNumber());
				}
			}
		}

		
	}

}

输出结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值