2014-11-23 80 views
0

我目前正在研究一种计算方法,该方法计算一个包含5名学生的课程的平均值。我的问题是如何处理平均法,以便忽略任何尚未创建的学生对象?这里s1,s2,s3,s4和s5是5个'student'类型的对象。那么如何编写公式,以便它忽略任何具有空值的学生,因为它没有被添加?更具体地说,我想编辑“其他”部分。我的代码如下 -如何解决Java中的空对象?

public double average() 
{ 
    if (s1 != null && s2 != null && s3 != null && s4 != null && s5 != null) 
    { 
     avg = (double) (s1.average() + s2.average() + s3.average() + s4.average() + s5.average())/ counter;  
     return avg; 
    } 
    else 
    { 
     avg = 0; 
     return avg; 
    } 
} 
+3

在这种情况下,解决方案很简单:不要if语句写这样。概括。它看起来像你想要一个列表/数组/集合。让程序为你做些工作,或多或少。不要手动编码所有可能的情况。 – keyser 2014-11-23 00:20:37

+0

@keyser是否有任何方法可以在不使用数组的情况下生成此方法,因为我尚未学习它们。我不介意写出所有类型的情况,但如果有人可以告诉我,甚至一个... – ScaVenGerS 2014-11-23 00:23:10

+1

是的,但你没有通过推迟了解他们做任何好处。您可以将x.average()添加到总数中,并记录沿途的非空数量。 'if(s1!= null)total + = s1.average(); numStudents ++;'那样你得到5个if语句,每个学生1个。请注意,我不建议您编写这样的代码:p – keyser 2014-11-23 00:25:05

回答

0

首先,您的方法似乎没有采取任何参数。我认为它应该。我建议你写一个variadac function

public static double average(Student... students) { 
    if (students == null) { 
     return 0; 
    } 
    double value = 0; 
    int count = 0; 
    for (Student s : students) { 
     if (s != null) { 
      value += s.average(); 
      count++; 
     } 
    } 
    if (count == 0) { 
     return 0; 
    } 
    return value/count; 
} 

如果你必须使用你的s1 - s5那么你可以使用loop unrolling

public double average() { 
    double value = 0; 
    int count = 0; 
    if (s1 != null) { 
     value += s1.average(); 
     count++; 
    } 
    if (s2 != null) { 
     value += s2.average(); 
     count++; 
    } 
    if (s3 != null) { 
     value += s3.average(); 
     count++; 
    } 
    if (s4 != null) { 
     value += s4.average(); 
     count++; 
    } 
    if (s5 != null) { 
     value += s5.average(); 
     count++; 
    } 
    if (count == 0) { 
     return 0; 
    } 
    return value/count; 
} 
+0

但是,即使存在1或2个空对象,这是否会使用公式,因为计数器在技术上会超过0? – ScaVenGerS 2014-11-23 00:44:01

+0

@ScaVenGerS - 您可能想要重新说明该评论。对我来说完全是无稽之谈。 – 2014-11-23 00:53:26

+0

@StephenC我在问,假设s4和s5是null,那么这段代码会做什么。它会跳过这些对象,并最终在公式中忽略它们吗? – ScaVenGerS 2014-11-23 00:55:58

0

我会用一个List<Student>(一List集合包含类型的对象Student),然后将您的方法中的代码更改为以下内容:

int sampleSum = 0, sampleQuantity = 0; 
for(Student student : studentList) { 
    if (student == null) { 
     // This student object is not set, so skip to the next object in studentList 
     continue; 
    } 
    sampleSum += student.average; 
    ++sampleQuantity; 
} 
return sampleSum/sampleQuantity; 

请注意,如果studentList中的学生都不为空,则会引发异常,因为会发生被零除的情况。如果sampleQuantity在返回语句之前的位置仍然为零,您可能更愿意修改代码以使其行为不同。

至于创建List<Student>这是非常容易的:

List<Student> studentList = new ArrayList<>(); 
studentList.add(anyStudentObject); 

,因为它们是Java的优秀成分这绝对是值得一读有关the Java Collections Framework

也读了the for-each loop in Java因为这是一个非常简洁的方式遍历Iterable类型,如List

+1

为什么首先会出现空列表中的学生? – EJP 2014-11-23 00:36:51

+0

谢谢你的帮助,我已经开始阅读数组了,但对于这个作业,我们的教授特意告诉我们不要使用数组,因为我们在这个项目之前没有使用数组。虽然我真的很感谢帮助看到另一种创建此方法的方法:D – ScaVenGerS 2014-11-23 00:40:55

+0

@EJP我只是想给用户一些自由,如果他们想要添加少于5个学生。 – ScaVenGerS 2014-11-23 00:41:36

0

如前所述这是以前更好使用数组或相似,但这里的反正一个解决方案:

public double average() { 
    double avg = 0; 
    int counter = 0; 

    if (s1 != null) { 
     avg += s1.average(); 
     counter++; 
    } 

    // ... 

    if (s5 != null) { 
     avg += s5.average(); 
     counter++; 
    } 

    if (counter > 0) return avg/counter; 
    else return 0; 
} 
+0

我认为你的代码中有一个错字。我认为你的final if块应该包含'avg + = s5.average()'而不是's1'。 – Bobulous 2014-11-23 15:58:27

+0

谢谢,我会编辑它。 – Martomate 2014-11-23 16:04:07