【问题标题】:Avoid returning "null" as an element of an array - homework避免将“null”作为数组元素返回 - 作业
【发布时间】:2012-09-25 23:45:53
【问题描述】:

我正在编写一个程序,该程序将输入一组包含学生姓名和 gpa 的学生,并只返回不及格的学生。我不确定如何返回一个数组,以避免将null 作为该数组的元素返回。 IE。如果初始数组中有 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

【问题讨论】:

    标签: java arrays methods


    【解决方案1】:

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

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

    【讨论】:

    • 有没有办法创建数组,使其可以继续扩展到原始数组的长度?
    • @gotguts,你不能扩展数组。只需创建新的。
    • 正如我提到的,一个 ArrayList,可能被声明为 ArrayList failedStudents = new ArrayList();会成功的。你可以使用 failedStudents.add(student);对于每一个不及格的学生。最后,您将返回 failedStudents.toArray();
    • 对于 OP,这更好:List&lt;Student&gt; failingStudents = new ArrayList&lt;Student&gt;();。请注意第二个泛型类型说明符中的原始错字。
    • 是的,我确实错误地将学生而不是学生。不过,我不确定您是否只想使用 List。在这种情况下,它可能提供了必要的功能,但 List 类型本身可能会丢失 ArrayList 提供的一些方法(不能说我的头上)。
    【解决方案2】:

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

    所以...

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

    只是一些伪代码。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是作业。我非常怀疑他是否会被允许使用 ArrayList,因为大多数时候编程分配要求非常严格。而且可能还没有研究过泛型。
      • 我会这样做,但问题是我不能为这个程序使用数组列表。不过感谢您的提示,我一定会记住这一点以备将来使用。
      【解决方案4】:

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

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

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

      【讨论】:

      • System.arraycopy 很好,但注意Arrays.copyOf 也很有用。后者在后台调用前者,但我发现它更容易使用。
      • @MichaelMcGowan 谢谢,很好的提示。我总是忘记Arrays.copyOf
      • @MichaelMcGowan,有没有办法在复制我的数组之前找到 null 的索引,所以我知道我的新数组的长度?还是 Arrays.copyOf 内置的?
      • @gotguts 您已经知道该索引,或者更好的是,新数组的长度:您正在跟踪有多少失败的 Student 对象与 j
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多