随机点名案例重构

一、案例介绍

随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息。

此案例在前面的文章中,已经介绍,现在要做的是对原有的案例进行升级,使用新的方式来实现。

我们来完成随机点名器,它具备以下3个内容:

1.存储所有同学姓名

2.总览全班同学姓名

3.随机点名其中一人,打印到控制台

 

二、案例分析

全班同学中随机的找出一名同学,打印这名同学的个人信息。

对本案例进行分析,得出如下分析结果:

1.存储全班同学信息(姓名、年龄)

2.打印全班同学每一个人的信息(姓名、年龄)

3.在班级总人数范围内,随机产生一个随机数,查找该随机数所对应的同学信息(姓名、年龄)并打印

随机点名器明确地分为了三个功能。如果将多个独立功能的代码写到一起,则代码相对冗长,针对不同的功能可以将其封装到一个方法中,将完整独立的功能分离出来。

而在存储同学姓名时,如果对每一个同学都定义一个变量进行姓名存储,则会出现过多孤立的变量,很难一次性将全部数据持有。此时,我们采用ArrayList集合来解决多个学生信息的存储问题。

 

三、重构内容分析

将原来使用的简单Student类,封装为包装属性和方法的相对完整的Student类,并将所有访问属性的地方改为通过get/set方法访问。

重构部分已使用红色样色字体表示

 

四、实现代码步骤

每名学生都拥有多项个人信息,为了方便管理每个人的信息,我们对学生信息进行封装,编写Student.java文件

/**

 * 学生信息类

 */

public class Student {

    private String name; // 姓名

    private int age; // 年龄

 

    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;

    }

}

         上述代码中,对学生信息(姓名、年龄)进行了封装。这样做的好处在于,以后只要找到这名学生,就能够知道他的每项个人信息了。

接下来我们编写CallName.java文件,完成程序的编写。

  1. main方法中调用三个独立方法

    public static void main(String[] args) {

        ArrayList<Student> list = new ArrayList<Student>(); //1.1创建一个可以存储多个同学名字的容器

        /*

         * 1.存储全班同学信息

         */

        addStudent(list);

        /*

         * 2.打印全班同学每一个人的信息(姓名、年龄)

         */

        printStudent(list);

        /*

         * 3.随机对学生点名,打印学生信息

         */

        randomStudent(list);

    }

 

1. 存储所有学生的个人信息

    /**

     * 1.存储全班同学名字

     */

    public static void addStudent(ArrayList<Student> list) {

        //键盘输入多个同学名字存储到容器中

        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 3; i++) {

            //创建学生

            Student s = new Student();

            System.out.println("存储第"+i+"个学生姓名:");

            String name = sc.next();

            s.setName(name);

            System.out.println("存储第"+i+"个学生年龄:");

            int age = sc.nextInt();

            s.setAge(age);

            //添加学生到集合

            list.add(s);

        }

    }

         上述方法中,方法参数list中用来表示已存储所有学生。通过Scanner,完成新学生信息(姓名,年龄)的录入,并将学生添加到集合中。

 

2. 打印全班同学每一个人的信息

    /**

     * 2.打印全班同学每一个人的信息(姓名、年龄)

     */

    public static void printStudent (ArrayList<Student> list) {

        for (int i = 0; i < list.size(); i++) {

            Student s = list.get(i);

            System.out.println("姓名:"+s.getName() +",年龄:"+s.getAge());

        }

    }

上述方法中,方法参数list中用来表示已存储所有学生。通过遍历集合中的每个元素,得到每个同学信息,并输出打印。

 

3. 随机对学生点名,打印学生信息

    /**

     * 3.随机对学生点名,打印学生信息

     */

    public static void randomStudent (ArrayList<Student> list) {

        //在班级总人数范围内,随机产生一个随机数

        Random r = new Random();
        int index = r.nextInt(list.size());

        //在容器(ArrayList集合)中,查找该随机数所对应的同学信息(姓名、年龄)

        Student s = list.get(index);

        System.out.println("被随机点名的同学:"+s.getName() + ",年龄:" + s.getAge());

    }

上述方法中,通过随机数类Random产生一个从0到集合长度的随机索引。使用该索引获取ArrayList集合中对应的值,便得到了全班同学的随机学生信息并打印。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值