2

我正在编写一个程序,该程序将使用他们的姓名和 gpa 输入一组学生,并只返回失败的学生。我不确定如何返回一个避免null作为该数组元素返回的数组。即,如果初始数组中有 4 个学生,但只有 2 个学生失败,则我的数组返回:student1, student2, null, null

Student Jim = new Student("Jim",1.4);
    Student Tom = new Student("Tom",3.0);
    Student John = new Student("John",4.0);
    Student Bill = new Student("Bill",1.2);
    Student[] group1 = {Jim,Tom,John,Bill};

public Student[] getFailing(Student[] students) {
    int i, j;
    Student[] failing = new Student[students.length];
    Student temp;
    for(i=0, j=0; i< students.length; i++){
            if(students[i].getGpa() < 2.0){
                temp = students[i];
                failing[j] = temp;
                j++;
            }

    }
    return failing;
}

我在 main 中进行测试运行时的当前结果是:

name = Jim gpa = 1.4
name = Bill gpa = 1.2
null
null
4

4 回答 4

3

如果唯一的问题是打印空值,也就是说,如果您的数组有null值但您不想在输出中看到它们,那么您可以保留您的方法并更改您的打印代码,以便它检查null,并避免打印它们。

但是,如果您必须将null值保留在数组之外,则可以使用动态调整大小的数据结构,例如,并使用该方法ArrayList从中获取数组。toArray

不使用ArrayList,因为您正在使用变量跟踪有多少Student对象代表失败的学生,所以j在收集失败的学生对象后,您可以创建一个所需长度的新数组,然后使用循环仅用非空学生填充它, 或使用Arrays.copyOf, 或System.arraycopy.

于 2012-10-04T20:58:09.757 回答
2

我会建议你ArrayList为你的程序使用一个。这允许您拥有一个可变大小的数组。这样,您不必担心空输出。您只需将您想要的学生添加到其中,并且大小会发生变化以反映这一点。

于 2012-10-04T20:57:25.163 回答
0

您正在创建一个与传入的原始数组一样长的数组(它用 null 填充所有元素),但不一定填充所有插槽。在给定的示例中,Tom 和 John 没有失败,因此您的数组中有两个空 (null) 插槽。

我不确定您的编程水平,但您可能会考虑使用动态数组,如 java.util.ArrayList,并将每个失败的学生添加到列表中,然后返回 toArray() 版本。

于 2012-10-04T20:56:12.657 回答
0

使failing数组的大小与失败学生的数量相同。因此,我会使用两个几乎相同的循环。

所以...

studentsFailed = 0;
while(hasNextStudent()) {
    studentsFailed++;
}
arr = new array[studentsFailed];

只是一些伪代码。

于 2012-10-04T20:57:06.843 回答