使用集合的嵌套实现需求
需求
用控制台输出以下结果:
班级:三班
-
姓名 学号
-
张三 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());
}
}
}
}
}