61-Java集合案例、ArrayList遍历删除、存对象、搜索

本文通过两个案例介绍了Java ArrayList的使用。首先,展示了如何遍历并删除ArrayList中低于特定值的元素,提供了两种解决方案。其次,演示了ArrayList如何存储自定义类型的对象,例如存储电影信息并展示。最后,实现了一个学生信息系统,包括添加学生信息、按学号搜索等功能,加深了对ArrayList存储和检索对象的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、案例:遍历并删除元素值

需求:

  • 某个班级的考试在系统上进行,成绩大致为: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分的成绩抹掉,并将集合输出
package com.app.arraylist;

import java.util.ArrayList;

/**
    练习题:遍历并删除元素值
        需求:
            某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100
            现在需要先把成绩低于80分以下的数据抹掉。
 */
public class ArrayListTest4 {
    public static void main(String[] args) {
        // 1.创建一个类型为Integer的ArrayList集合scoreList,用于存储学生的考试成绩
        ArrayList<Integer> scoreList = new ArrayList<>();

        // 2.录入学生成绩
        scoreList.add(98);
        scoreList.add(77);
        scoreList.add(66);
        scoreList.add(89);
        scoreList.add(79);
        scoreList.add(50);
        scoreList.add(100);

        // 4.调用removeScore方法,将分数低于80分的成绩抹掉,并将集合输出
        System.out.println("原成绩: " + scoreList);
        removeScore(scoreList);
    }

    // 3.定义一个用于删除成绩低于80分的方法removeScore,无返回值,设置一个形参: ArrayList<Double> list,用于接收scoreList集合
    public static void removeScore(ArrayList<Integer> list) {
        // (3.1) 定义for循环,遍历scoreList集合:
        // list = [98, 77, 66, 89, 79, 50, 100]
        // list = [98, 66, 89, 50, 100]
        //                          i
        // 有毛病的代码!
        // 因为每当删除掉一个元素,下一个元素就会跳到当前位置,这样就会跳过一个数据
        /*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, 77, 66, 89, 79, 50, 100]
        // [98, 89, 100]
        //           i
        // 解决方案1: 每当删除掉一个元素,让当前位置往后退一位
        /*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, 77, 66, 89, 79, 50, 100]
        // [98, 89, 100]
        //  i
        // 解决方案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);
    }
}
控制台:

原成绩: [98, 77, 66, 89, 79, 50, 100]
新成绩: [98, 89, 100]

Process finished with exit code 0

总结

1、从集合中遍历元素,并筛选出元素删除它,应该怎么解决?

  • 1.从集合后面遍历然后再进行判断,后删除,可以避免漏掉元素
  • 2.当元素被删除后,可以让当前位置往后退一位,然后再进行判断,后删除,可以避免漏掉元素

二、ArrayList集合存储自定义类型的对象

案例:影片信息在程序中的表示

需求:
在这里插入图片描述

  • 某影院系统需要在后台存储上述三部电影,然后依次展示出来。

分析:

  • 首先,需要设计一个电影类
  • 然后,创建一个集合封装电影信息
  • 最后,遍历集合,依次展示电影信息

实现:

1.定义实体类: 电影类
  (1.1) 成员变量: 电影名称、导演、主演、地区、类型、评分
  (1.2) 提供成员变量对应的getter、setter方法,暴露其取值和赋值
  (1.3) 提供有参和无参数构造器
2.创建三部电影
3.创建一个电影类型的集合movieList,将三部电影封装进集合
4.定义一个展示电影信息的方法showMovie,无返回值,设置一个形参: ArrayList<电影类> movieList,用于接收movieList集合
  (4.1)定义for循环,遍历集合:
       a: 接收遍历到的电影,并依次展示电影信息
5.调用showMovie方法,依次展示电影信息
package com.app.arraylist;

// 1.定义实体类: 电影类
public class Movie {
    /**
        (1.1) 成员变量: 电影名称、导演、主演、地区、类型、评分
     */
    private String name;
    private String director;
    private String starring;
    private String area;
    private String type;
    private double score;

    /**
        (1.2) 提供成员变量对应的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;
    }


    /**
        (1.3) 提供有参和无参数构造器
     */
    public Movie() {

    }

    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;
    }
}
package com.app.arraylist;

import java.util.ArrayList;

/**
    案例:影片信息在程序中的表示
        目标:
          理解ArrayList集合存储自定义类型的对象
        需求:
          某影院系统需要在后台存储上述三部电影,然后依次展示出来。
 */
public class ArrayListTest5 {
    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集合
    public static void showMovie(ArrayList<Movie> movieList) {
        // (4.1)定义for循环,遍历集合:
        for (int i = 0; i < movieList.size(); i++) {
            // a: 接收遍历到的电影,并依次展示电影信息
            Movie movie = movieList.get(i);
            
            System.out.println(movie.getName() + "\n"
                                + "导演: " + movie.getDirector() + "\n"
                                + "主演: " + movie.getStarring() + "\n"
                                + "地区: " + movie.getArea() + "\n"
                                + "类型: " + movie.getType() + "\n"
                                + "评分: " + movie.getScore());
            System.out.println("-----------------------------------------");
        }
    }
}
控制台:

《肖申克的救赎》
导演: 弗兰克·德拉邦特
主演: 蒂姆·罗宾斯
地区: 1994/美国
类型: 犯罪/剧情
评分: 9.7
-----------------------------------------
《霸王别姬》
导演: 陈凯歌
主演: 张国荣
地区: 1993/中国大陆 中国香港
类型: 剧情/爱情/同性
评分: 9.6
-----------------------------------------
《阿甘正传》
导演: 罗伯特·泽米吉斯
主演: 汤姆·汉克斯
地区: 1994/美国
类型: 剧情/爱情
评分: 9.5
-----------------------------------------

Process finished with exit code 0
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 com.app.arraylist;

// 1.定义实体类: 学生类
public class Student {
    /**
        (1.1) 成员变量: 学号、姓名、年龄、专业班级
     */
    private String id;
    private String name;
    private int age;
    private String profeClass;

    /**
        (1.2) 提供成员变量对应的getter、setter方法,暴露其取值和赋值
     */
    public String getId() {
        return id;
    }

    public void setId(String 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;
    }

    public String getProfeClass() {
        return profeClass;
    }

    public void setProfeClass(String profeClass) {
        this.profeClass = profeClass;
    }

    /**
        (1.3) 提供有参和无参数构造器
     */
    public Student() {

    }

    public Student(String id, String name, int age, String profeClass) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.profeClass = profeClass;
    }
}
package com.app.arraylist;

import java.util.ArrayList;
import java.util.Scanner;

/**
    案例:学生信息系统的数据搜索
         需求:
            - 后台程序需要存储加上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
 */
public class ArrayListStudentTest6 {
    public static void main(String[] args) {
        // 2.创建键盘录入对象,用于控制台输入
        Scanner sc = new Scanner(System.in);

        // 3.创建一个学生类型的集合students,用于存储添加的学生信息
        ArrayList<Student> students = new ArrayList<>();

        // 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班"));

        // 5.设计操作界面
        while (true) {
            // (5.1) 打印界面
            System.out.println("1.查看所有学生信息");
            System.out.println("2.根据学号查看学生信息");
            System.out.println("3.退出操作");

            // (5.2) 用户输入指令
            System.out.println("请输入指令: ");
            int command = sc.nextInt();

            // (5.3) 定义switch分支,根据指令进行相应的操作:
            switch (command) {
                // a: 1——>查看所有学生信息
                case 1:
                    showStudents(students);
                    break;

                // b: 2——>根据学号查看学生信息
                case 2:
                    // (1) 输入学号,搜索学生信息
                    System.out.println("请输入要查询的学生学号: ");
                    // a: 定义变量接收输入的学号
                    String id = sc.next();
                    // b: 定义变量接收查询结果
                    Student student = getStudentsById(students, id);

                    // (2) 判断返回的学生对象是否为空
                    if (student == null) {
                        // 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.print("————————————————————————————————————————————————————");
                        System.out.println(student.getId() + "\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;

                // d: 默认——>指令有误!
                default:
                    System.out.println("指令有误!");
                    break;
            }
        }
    }


    /**
     * 6.定义查看所有学生信息的方法showStudents,无返回值,一个形参
     * @param students      存储所有学生信息的集合
     */
    //
    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.getId() + "\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.getId())) {
                // 相等,返回学生对象
                return stu;
            }
        }
        // (7.2) 找完了,都没有找到该学生,说明查无此人,返回null
        return null;
    }
}
控制台:

1.查看所有学生信息
2.根据学号查看学生信息
3.退出操作
请输入指令: 
1
===================查看所有学生信息====================
学号				姓名				年龄		班级
————————————————————————————————————————————————————
20180302		叶孤城			23		护理一班
————————————————————————————————————————————————————
20180303		东方不败			23		推拿二班
————————————————————————————————————————————————————
20180304		西门吹雪			26		中药学四班
————————————————————————————————————————————————————
20180305		梅超风			26		神经科2班
————————————————————————————————————————————————————

1.查看所有学生信息
2.根据学号查看学生信息
3.退出操作
请输入指令: 
12345
指令有误!
1.查看所有学生信息
2.根据学号查看学生信息
3.退出操作
请输入指令: 
2
请输入要查询的学生学号: 
20180305
您查询到的学生信息如下: 
学号				姓名				年龄			班级
————————————————————————————————————————————————————
20180305		梅超风			梅超风		神经科2班
————————————————————————————————————————————————————

1.查看所有学生信息
2.根据学号查看学生信息
3.退出操作
请输入指令: 
3

Process finished with exit code 0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值