一、案例:遍历并删除元素值
需求:
- 某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100
- 现在需要先把成绩低于80分以下的数据抹掉。
分析:
- 创建一个ArrayList集合,类型为Integer,用于存储学生的考试成绩
- 录入学生的考试成绩,调用ArrayList集合的删除方法将成绩低于80分的删除掉
示例:
/* 1.创建一个类型为Double的ArrayList集合scoreList,用于存储学生的考试成绩
2.录入学生成绩
3.定义一个用于删除成绩低于80分的方法removeScore,无返回值,设置一个形参: ArrayList<Double> list,用于接收scoreList集合
(3.1) 定义for循环,遍历scoreList集合:
a: 判断每次遍历到的分数是否低于80分:
是,则从集合中去掉;
删除后,结束循环。
4.调用removeScore方法,将分数低于80分的成绩抹掉,并将集合输出
*/
public static void main(String[] args) {
ArrayList<Integer> scoreList = new ArrayList<>(); //1.创建一个类型为Integer的ArrayList集合scoreList,用于存储学生的考试成绩
scoreList.add(98); //2.录入学生成绩
scoreList.add(77);
scoreList.add(66);
scoreList.add(89);
scoreList.add(79);
scoreList.add(50);
scoreList.add(100);
System.out.println("原成绩"+scoreList); // 4.调用removeScore方法,将分数低于80分的成绩抹掉,并将集合输出
RemoveScore(scoreList);
}
//3.定义一个用于删除成绩低于80分的方法removeScore,无返回值,设置一个形参: ArrayList<Double> list,用于接收scoreList集合
public static void RemoveScore(ArrayList<Integer> list){
// (3.1) 定义for循环,遍历scoreList集合:
// for (int i = 0; i < list.size(); i++) {
// int score = list.get(i);
// // a: 判断每次遍历到的分数是否低于80分:
// if (score < 80) {
// // 是,则从集合中去掉;
// list.remove(i);
// }
// }
// System.out.println("新成绩: " + list);
//这段代码给出的输出结果为98,66,89,50,100,不符合我们的需求
//这是一段有毛病的代码,因为每当删除掉一个元素,下一个元素就会跳到当前位置,这样就会跳过一个数据
//解决方案1:每当删除掉一个元素,让当前位置往后退一位。i--
// for (int i = 0; i < list.size(); i++) {
// int score = list.get(i);
// // a: 判断每次遍历到的分数是否低于80分:
// if (score < 80) {
// // 是,则从集合中去掉;
// list.remove(i);
// // 每当删除掉一个符合条件的元素,i--: 让当前位置往后退一位,如此不会跳过数据
// i--;
// }
// }
// System.out.println("新成绩: " + list);
//控制台输出的结果为98,89,100,符合我们的需求
// 解决方案2: 从集合的末尾开始遍历再删除就可以解决
/*
这里的 集合大小-1: 表示i的位置在集合末尾处;
i >= 0: 表示i要一直>=0;
i--: 表示一直往后退
*/
// for (int i = list.size()-1; i >=0 ; i--) {
// int score = list.get(i);
// if (score < 80){
// list.remove(i);
// }
// }
// System.out.println("新成绩:"+list);
}
控制台第一次输出结果:
控制台最终输出结果:
二、ArrayList集合存储自定义类型的对象
案例:影片信息在程序中的表示
需求:
- 某影院系统需要在后台存储三部电影,然后依次展示出来。
分析:
- 首先,需要设计一个电影类
- 然后,创建一个集合封装电影信息
- 最后,遍历集合,依次展示电影信息
package arraylist;
/*1.定义实体类: 电影类
(1.1) 成员变量: 电影名称、导演、主演、地区、类型、评分
(1.2) 提供成员变量对应的getter、setter方法,暴露其取值和赋值
(1.3) 提供有参和无参数构造器
*/
// 1.定义实体类: 电影类
public class Movie {
//成员变量: 电影名称、导演、主演、地区、类型、评分
private String name;
private String director;
private String starring;
private String area;
private String type;
private double score;
//提供成员变量对应的getter、setter方法,暴露其取值和赋值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getStarring() {
return starring;
}
public void setStarring(String starring) {
this.starring = starring;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Movie(String name, String director, String starring, String area, String type, double score) {
this.name = name;
this.director = director;
this.starring = starring;
this.area = area;
this.type = type;
this.score = score;
}
public Movie(){
}
}
package arraylist;
import java.util.ArrayList;
public class ArrayListMovie {
public static void main(String[] args) {
// 2.创建三部电影
Movie m1 = new Movie("《肖申克的救赎》", "弗兰克·德拉邦特",
"蒂姆·罗宾斯", "1994/美国", "犯罪/剧情", 9.7);
Movie m2 = new Movie("《霸王别姬》", "陈凯歌",
"张国荣", "1993/中国大陆 中国香港", "剧情/爱情/同性", 9.6);
Movie m3 = new Movie("《阿甘正传》", "罗伯特·泽米吉斯",
"汤姆·汉克斯", "1994/美国", "剧情/爱情", 9.5);
// 3.创建一个电影类型的集合movieList,将三部电影封装进集合
ArrayList<Movie> movieList = new ArrayList<>();
movieList.add(m1);
movieList.add(m2);
movieList.add(m3);
// 5.调用showMovie方法,依次展示电影信息
showMovie(movieList);
}
// 4.定义一个展示电影信息的方法showMovie,无返回值,设置一个形参: ArrayList<电影类> movieList,用于接收movieList集合
private static void showMovie(ArrayList<Movie> movieList) { // (4.1)定义for循环,遍历集合:
for (int i = 0; i < movieList.size(); i++) {
Movie movie = movieList.get(i); // a: 接收遍历到的电影,并依次展示电影信息
System.out.println(movie.getName()+"\n"
+ "导演: " + movie.getDirector() + "\n"
+ "主演: " + movie.getStarring() + "\n"
+ "地区: " + movie.getArea() + "\n"
+ "类型: " + movie.getType() + "\n"
+ "评分: " + movie.getScore());
System.out.println("------------------------------");;
}
}
}
控制台输出结果:
ArrayList集合的内存执行原理
结论:集合中存储的元素并不是对象本身,而是对象的地址
三、案例:学生信息系统的数据搜索
需求:
后台程序需要存储加上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析:
首先,需要设计一个实体类: 学生类,成员变量有学号、姓名、年龄、专业班级
然后,创建一个学生类型的集合,用于存储如上学生信息
之后,定义一个根据学生学号查看学生信息的方法
最后,调用这个方法,输入你要查询的学号,展示这个学号的学生信息
实现:
1.定义实体类: 学生类
(1.1) 成员变量: 学号、姓名、年龄、专业班级
(1.2) 提供成员变量对应的getter、setter方法,暴露其取值和赋值
(1.3) 提供有参和无参数构造器
2.创建键盘录入对象,用于控制台输入
3.创建一个学生类型的集合students,用于存储添加的学生信息
4.添加学生信息
5.设计操作界面
(5.1) 打印界面
(5.2) 用户输入指令
(5.3) 定义switch分支,根据指令进行相应的操作:
a: 1——>查看所有学生信息
b: 2——>根据学号查看学生信息
(1) 输入学号,搜索学生信息
a: 定义变量接收输入的学号
b: 定义变量接收查询结果
(2) 判断返回的学生对象是否为空
a: 为空,说明查无此人
b: 不为空,展示该学号的学生信息
c: 3——>退出操作
d: 默认——>指令有误!
6.定义查看所有学生信息的方法showStudents,无返回值,一个形参: 用于接收所有学生信息的集合
(6.1) 定义for循环,遍历集合:
a: 用变量接收遍历到的学生信息
b: 依次展示学生信息
7.定义根据学号查看学生信息的方法getStudentsById,返回值类型是学生类,两个形参: 分别用于接收所有学生信息的集合、搜索学生的学号
(7.1) 定义for循环,遍历集合:
a: 用变量接收遍历到的学生对象
b: 判断搜索学生的学号 与 遍历到的学生的学号 是否相等
相等,返回学生对象
(7.2) 找完了,都没有找到该学生,说明查无此人,返回null
package arraylist;
public class Student {
//(1.1) 成员变量: 学号、姓名、年龄、专业班级
private String studentid;
private String name;
private int age;
private String profeClass;
//(1.2) 提供成员变量对应的getter、setter方法,暴露其取值和赋值
public String getStudentid() {
return studentid;
}
public void setStudentid(String studentid) {
this.studentid = studentid;
}
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 String getProfeClass() {
return profeClass;
}
public void setProfeClass(String profeClass) {
this.profeClass = profeClass;
}
//(1.3) 提供有参和无参数构造器
public Student(String studentid, String name, int age, String profeClass) {
this.studentid = studentid;
this.name = name;
this.age = age;
this.profeClass = profeClass;
}
public Student(){
}
}
package arraylist;
import java.util.ArrayList;
import java.util.Scanner;
public class DemoStudent {
public static void main(String[] args) {
// 案例:学生信息系统的数据搜索
// 需求:后台程序需要存储加上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
Scanner sc = new Scanner(System.in); // 2.创建键盘录入对象,用于控制台输入
ArrayList<Student> students = new ArrayList<>(); // 3.创建一个学生类型的集合students,用于存储添加的学生信息
// 4.添加学生信息
students.add(new Student("20180302", "叶孤城", 23, "护理一班"));
students.add(new Student("20180303", "东方不败", 23, "推拿二班"));
students.add(new Student("20180304", "西门吹雪", 26, "中药学四班"));
students.add(new Student("20180305", "梅超风", 26, "神经科2班"));
while (true) { // 5.设计操作界面
// (5.1) 打印界面
System.out.println("1.查看所有学生信息");
System.out.println("2.根据学号查看学生信息");
System.out.println("3.退出操作");
System.out.println("请输入指令:"); // (5.2) 用户输入指令
int command = sc.nextInt();
switch (command){ // (5.3) 定义switch分支,根据指令进行相应的操作:
case 1: // a: 1——>查看所有学生信息
showStudents(students);
break;
case 2: // b: 2——>根据学号查看学生信息
System.out.println("请输入要查询的学生学号:"); // (1) 输入学号,搜索学生信息
String id = sc.next(); // a: 定义变量接收输入的学号
Student student= getStudentsById(students,id);// b: 定义变量接收查询结果
if (student == null){ // (2) 判断返回的学生对象是否为空
// a: 为空,说明查无此人
System.out.println("查无此人!!");
System.out.println();
}else {
// b: 不为空,展示该学号的学生信息
System.out.println("您查询到的学生信息如下: ");
System.out.println("学号\t\t\t\t姓名\t\t\t\t年龄\t\t\t班级");
System.out.println("————————————————————————————————————————————————————");
System.out.println(student.getStudentid() + "\t\t"
+ student.getName() + "\t\t\t"
+ student.getName() + "\t\t"
+ student.getProfeClass());
System.out.print("\n————————————————————————————————————————————————————");
System.out.println();
}
break;
// c: 3——>退出操作
case 3:
System.exit(0);
break;
}
}
}
public static void showStudents(ArrayList<Student>students){
System.out.println("===================查看所有学生信息====================");
System.out.println("学号\t\t\t\t姓名\t\t\t\t年龄\t\t班级");
System.out.println("————————————————————————————————————————————————————");
// (6.1) 定义for循环,遍历集合,展示集合中所有学生信息
for (int i = 0; i < students.size(); i++) {
// a: 用变量接收遍历到的学生信息
Student stu = students.get(i);
// b: 依次展示学生信息
System.out.print(stu.getStudentid() + "\t\t"
+ stu.getName() + "\t\t\t"
+ stu.getAge() + "\t\t"
+ stu.getProfeClass());
System.out.print("\n————————————————————————————————————————————————————\n");
}
System.out.println();
}
/**
* 7.定义根据学号查看学生信息的方法getStudentsById,返回值类型是学生类,两个形参
* @param students 存储所有学生信息的集合
* @param id 搜索学生的学号
* @return 搜索到返回学生对象,否则返回null
*/
public static Student getStudentsById(ArrayList<Student> students, String id) {
// (7.1) 定义for循环,遍历集合:
for (int i = 0; i < students.size(); i++) {
// a: 用变量接收遍历到的学生对象
Student stu = students.get(i);
// b: 判断搜索学生的学号 与 遍历到的学生的学号 是否相等
if (id.equals(stu.getStudentid())) {
// 相等,返回学生对象
return stu;
}
}
// (7.2) 找完了,都没有找到该学生,说明查无此人,返回null
return null;
}
}
控制台输出结果: