我有这个相当令人毛骨悚然的声明,我敢肯定有一种压缩方法,但是我真的不知道如何。有人告诉我if语句可以工作,但我从未使用过case语句,我不确定。

public void add(int p, Course c)
{
    if (p == 1){
    if (course1.isFree() == true) {
        course1 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 2){
        if (course2.isFree() == true) {
        course2 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 3){
        if (course3.isFree() == true) {
        course3 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 4){
        if (course4.isFree() == true) {
        course4 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 5){
        if (course5.isFree() == true) {
        course5 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 6){
        if (course6.isFree() == true) {
        course6 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 7){
        if (course7.isFree() == true) {
        course7 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    } else if (p == 8){
        if (course8.isFree() == true) {
        course8 = c;
        System.out.println("Course " + c + "added to period " + p +".\n");
    } else {
        System.out.println("Unable to add class to a nonfree period.");
    }
    }

    totalcredits();
}


评论

我将从修复缩进开始,以确保您要处理的内容,

#1 楼


    if (course3.isFree() == true) {
    course3 = c;
    System.out.println("Course " + c + "added to period " + p +".\n");
} else {
    System.out.println("Unable to add class to a nonfree period.");
}

...

} else if (p == 8){
    if (course8.isFree() == true) {
    course8 = c;
    System.out.println("Course " + c + "added to period " + p +".\n");
} else {
    System.out.println("Unable to add class to a nonfree period.");
}


好东西没有20 .. 200 ... 2,000 ... 20,000个课程!
这段代码需要稍微干燥一下。不要重复自己。™
编程是关于抽象的-此代码非常需要这里的代码:您的程序中应该有一堆课程的概念。
那么就有可能只写块一次。给定courses是一门课程的数组Course ...当然:
public void add(int period, Course course) {
|
|---if (courses[period].isFree()) {
|   |
|   |---courses[period] = course; 
|   |---System.out.println("Course " + course + "added to period " + period +".\n");
|   |
|---} else {
|   |
|   |---System.out.println("Unable to add class to a nonfree period.");
|---}
|
}

注意合并范围大括号的位置:通过将其与打开合并范围的行的凹口对齐,可以使该代码更容易遵循,并且避免这种情况:

    }
    }


还要注意我使用的名称。避免使用单字母标识符,例如pc。当代码可读时,代码更容易阅读。

这太冗长了:

if (course.isFree() == true) {


因为course.isFree()很明显返回了布尔值,则布尔值本身可以用作条件的表达式,这意味着您无需将其与true进行比较:
if (course.isFree()) {


#2 楼

@Mat的杯子有一个很好的答案,我想进一步提出几个问题:


course1...course8是什么?全局变量?为什么不是Collection课程?
pccourse1...course8之间到底是什么关系? p是否以某种形式的用户输入指示c应当经过的期望时段,并为course<n>之一设置?我之所以这样问,是因为您显然只是在检查course<n>是否在期间<n>内是免费的。
调用totalcredits()与将课程添加到8个期间之一有关吗?

如果您可以通过回答上述一些问题来发布后续问题(例如,从其他部分获得更多代码),那么我认为我们可以为您提供更多帮助。

edit:

让我们尝试将动作分解为几个步骤。



我们需要获取指定course值的period,所以我们可能像这样的东西:

private Course getCourse(int period) {
    return courses.get(period - 1); // assuming period is not zero-based
}



我们现在可以在getCourse(period)方法中调用add

public final void add(int period, final Course course) {
    final Course selectedCourse = getCourse(period);
    if (selectedCourse.isFree()) {
        // do something about course
        // print success
    } else {
        // print failure
    }
}



course<n>设置为course输入是什么意思?您是否也不需要做类似setFree(false)的操作来表明该课程“不再免费”?这就是为什么我建议您重新评估将课程添加到期间并将该期间标记为已占用的逻辑的原因。您可能需要执行以下操作:

if (selectedCourse.isFree()) {
    selectedCourse.copyFrom(course); // maybe some checks on 'free' will be done too
}




评论


\ $ \ begingroup \ $
老实说,这样做的大部分目的只是为了满足我的AP-comp sci类的要求...只要它对我有效。他希望我们这样做,所以我做到了,我本来希望有一个数组。课程1-8实际上是对象,我使用了构造函数来构建它们,这是一个相当原始的系统,它们是实现此目的的更有效的方法。
\ $ \ endgroup \ $
– RexPRGMER
2014年10月1日,下午2:36

\ $ \ begingroup \ $
嗯,如果您仍然喜欢course1 ... course8,也许您仍然可以考虑我关于单独的getCourse()方法的想法,以隐藏从实际add方法中选择指定时间段的课程的逻辑,以防万一您可以并且希望将来将其更改(更改为数组/集合)。这将大大简化add方法中的代码。
\ $ \ endgroup \ $
– h.j.k.
2014年10月1日在2:41



\ $ \ begingroup \ $
@RexPRGMER如果负责人想要一些奇怪的事情,则应该遵循。但是不要从字面上解释它,他们希望能够访问course1等,因此提供这样的接口,但是请考虑将所有代码编码8次。将所有课程打包到一个数组/列表广告作品中。到处。
\ $ \ endgroup \ $
– maaartinus
2014年10月1日,下午3:29

#3 楼

由于要测试整数的相等性,因此请使用switch而不是多个if-else if。

switch(p){
    case 1:
       break;
    case 2:
       break;

}


上面的代码等效于

if(p == 1){

}
else if(p == 2){

}


可以将简化版if与运算符?结合使用,以实现简单的if-else。因此,您的代码将如下所示:

public void add(int p, Course c){
    Course currentCourse;
    switch(p){
     case 1:
           //if course1.isFree, currentCourse is c, else currentCourse is course1
           currentCourse = course1.isFree() ? c : course1;
           break;
     case 2:
           currentCourse = course2.isFree() ? c : course2;
           break;

     <add more cases here>
     }

     //display appropriate message
     if(currentCourse.equals(c)){
         System.out.println("Course " + c + "added to period " + p +".\n");
     }else{
         System.out.println("Unable to add class to a nonfree period.");
     }
}