结合实验浅谈ArrayList用法

描述

ArrayListJava中的一种动态数组,相关的问题出现在Java实验三第5题(选做)。

改写程序清单10-6中的Course类。使用ArrayList代替数组来储存学生。不应该改变Course类的原始合约(即构造方法和方法的定义都不应该改变)。

程序清单10-6如下所示:

public class Course {

    private String courseName;
    private String[] students = new String[100];
    private int numberOfStudents;

    public Course(String courseName) {
        this.courseName = courseName;
    }

    public void addStudent(String student) {
        students[numberOfStudents] = student;
        numberOfStudents++;
    }

    public String[] getStudents() {
        return students;
    }

    public int getNumberOfStudents() {
        return numberOfStudents;
    }

    public String getCourseName() {
        return courseName;
    }

    public void dropStudent(String student) {
        //Left as an exercise in Exercise 10.9
    }
}
分析

既然需要用到ArrayList类,我们就要考察一下这个类当中有哪些需要我们关注的方法。首先我们需要初始化一个动态数组students,即构造方法。在后面的addStudent(String)dropStudent(String)两个方法中,我们分别需要在动态数组中添加和删去指定的元素。

打开ArrayList.java文件可以寻找我们需要的方法。

  • 构造

ArrayList类提供了3种构造方法,分别是:

  1. ArrayList(int initialCapacity)
  2. ArrayList()
  3. ArrayList(Collection<? extends E> c)

如果你看不懂第三个,暂时没有关系,一会你会对它有所了解的。

  • 添加

ArrayList类提供了4种添加方法,但是其中2种是布尔型的判断,只有2种可以添加元素:

  1. add(int index, E element)
  2. add(E e)

传入的是一个整形值和一个任意类型的元素或者只有一个元素(关于E类型你可以暂时这样理解)。

  • 删去

ArrayList类提供了4种删去方法,但是和添加方法一样,只有2种可以删去元素:

  1. remove(int index)
  2. remove(Object o)

同上,传入一个任意类型的元素或者是角标号。

代码及解释

根据题目要求,我们将使用第一种构造方法。新的Course类代码如下:

public class Course {

    private String courseName;
    private ArrayList students = new ArrayList(100);
    private int numberOfStudents;

    public Course(String courseName) {
        this.courseName = courseName;
    }

    public void addStudent(String student) {
        students.add(numberOfStudents, student);
        numberOfStudents++;
    }

    public ArrayList getStudents() {
        return students;
    }

    public int getNumberOfStudents() {
        return numberOfStudents;
    }

    public String getCourseName() {
        return courseName;
    }

    public void dropStudent(String student) {
        students.remove(student);
        numberOfStudents--;
    }

}

可以看到,由于添加和删除方法的限制,我们使用的都是传入元素的添加删除方法。

不过,在某些IDE当中,这些代码可能会带来一条Warning:

Unchecked call to add(int, E) as a member of raw type 'java.util.ArrayList'.

根据字面意思可以知道,是泛型类的赋值需要检测的原因(你也可以认为是类型可能会发生不匹配)。但是作为一个程序员(强迫症),一定要把Warning扼杀在摇篮里。你可以在类的声明之前添加一行代码去掉这条提示:

@SuppressWarnings("unchecked")

测试方法的代码如下:

public class CourseTest {

    public static void main(String[] args) {
        Course course = new Course("Java");
        for (int i = 1; i <= 10; ++i) {
            course.addStudent(String.format("Student%d", i));
        }
        System.out.println("Step 1:We initialized 10 students into the ArrayList.");
        System.out.println("Course Name: " + course.getCourseName() + "\nNumber of students: " + course.getNumberOfStudents() + "\nStudents List: " + course.getStudents());
        for (int i = 1; i <= 5; ++i) {
            course.dropStudent(String.format("Student%d",i));
        }
        System.out.println("\nStep 2:We removed 5 students from the ArrayList.");
        System.out.println("Course Name: " + course.getCourseName() + "\nNumber of students: " + course.getNumberOfStudents() + "\nStudents List: " + course.getStudents());
    }
}

这其中需要解释的是,String.formatString类的自带方法,意思是按照某种格式生成字符串,由于我加入了循环,生成的学生名就是Student1到Student10了。

吐槽:OC在写这个方法的时候就比较复杂了,大概是:

[NSString stringWithFormat:@"blabla"];

总结

这道题作为选作还是很有必要的,我大概看文件就要花了半个小时的时间,确实是个很考验能力的题目呢。

ZHRMoe Studio 4/10/2015.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

39 − 32 =