集合的嵌套(泛型)和递归算法
1、 集合的嵌套:
集合的用法其实和数组的用法有很多共同之处,在使用数组的时候,二维数组就是数组的嵌套;
那么在集合之中是否也可以这样呢?
当然也是可以的,例如对于最复杂的的map集合;
map<string, map<string,student>>;这样map中就嵌套了一个map集合;
其中对于map右边的<>尖括号是泛型的一种应用;
a、泛型
使用尖括号里面规定存入的类型,简单来说就是对于存入数据的一种限制,和数组比较像,只能够存入一种数据类型,如果有其它类型存入会发生报错;
例如:如果定义: list<string> 那么存入list集合中的所有类型都是string类型,
作用:安全性高,每次循环遍历时不需要进过object到规定类型的向下转型,操作便利;
对于泛型现在只会简单的操作,这里不做详细介绍;
b、举例说明集合嵌套:
有一个school,里面有n个班级(自己定义),每个班都有特定的班号,每个班级都有m个学生(不限),每个学生都有特定的学号,学生类有姓名,学号,分数;
存入学校的学生数据,计算每一个班级的学生总成绩,和平均分,最后计算学校的总成绩和平均分;
分析:这里有两个键值集合,一个是每个班级对应的有特定的班号,另一个是每个学生有对应学号,需要用到嵌套循环;
map<string,classroom>,map<string, student>;
实现代码如下:
学生类:
package jihe;
public class Student {
private String name;
private int num;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int num, double score) {
super();
this.name = name;
this.num = num;
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", num=" + num + ", score=" + score + "]";
}
}
班级类:
package jihe;
import java.util.Map;
public class Classroom {
private Map<Integer, Student> classroom;
public Map<Integer, Student> getClassroom() {
return classroom;
}
public void setClassroom(Map<Integer, Student> classroom) {
this.classroom = classroom;
}
public Classroom() {
super();
// TODO Auto-generated constructor stub
}
public Classroom(Map<Integer, Student> classroom) {
super();
this.classroom = classroom;
}
}
测试类:
package jihe;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class test {
public static void main(String[] args) {
Map<String, Classroom> school=new HashMap<>();
Scanner sc = new Scanner(System.in);
do {
System.out.println("请输入班级编号:");
String str1=sc.next();
if (str1.equals("n")) {//输入n终止输入班级信息
break;
}
Classroom newclass= new Classroom();
Map<Integer, Student> classroom=new HashMap<>();
do {
System.out.println("请输入学生姓名:");
String name=sc.next();
if (name.equals("n")) {//输入n终止输入这个班级的学生
break;
}
System.out.println("请输入学生学号:");
int num = sc.nextInt();
System.out.println("请输入学生分数:");
double score = sc.nextDouble();
Student student = new Student(name, num, score);
classroom.put(student.getNum(), student);
} while (true);
newclass.setClassroom(classroom);
school.put(str1, newclass);
} while (true);
Set<String> keySet = school.keySet();
double scores=0;
int nums=0;
for (String key : keySet) {
Classroom cl=school.get(key);
double score=0;
Map<Integer, Student> map=cl.getClassroom();
Set<Integer> key2 = map.keySet();
for (Integer integer : key2) {
score+=map.get(integer).getScore();
System.out.println(integer+":"+map.get(key2));
}
System.out.println(key+"班级的总分是:"+score+"平均分是:"+score/key2.size());
scores+=score;
nums+=key2.size();
}
System.out.println("学校所有班级的总分是:"+scores+"平均分是:"+scores/nums);
}
}
上面的学校实例可以很好的实现集合的嵌套;
2、 递归算法
释义:方法调用自己本身;
例如,计算自然数的和除了运用for循环,还可以使用递归算法:
public static int add(int i){
if(i==0){
return 0;
}
return add(i-1)+i;
}