如何检查数组是否为空?

时间:2017-03-06 21:22:34

标签: java

这是我的代码,输出只打印第一个课程,我不知道有什么问题,我想要一些帮助:(

public class student {
  private long student_ID;
  private int[] listOfCourses= new int[5];
  private double[] Mark=new double[5];
  private int numCoures;  

  public student(long student_ID) {
    this.student_ID=student_ID;
  }

  long getStudentID() {
    return student_ID;
  }

  int getnumCoures(){
    return numCoures;
  }

  void addCourse(int CN) {
    for(int i=0 ; i<listOfCourses.length ; i++){
      if (listOfCourses[i]==0) {
        listOfCourses[i]=CN;  
      }
    }
    numCoures++;
  }

  void addMark(int CN,double M) {
    for(int i=0 ; i<listOfCourses.length ; i++) {
      if(listOfCourses[i]==CN) {
        Mark[i]=M;
      }
    }
  }

  void print() {
    System.out.println("NAME OF student "+student_ID);
    for(int i=0 ; i<numCoures ; i++) { 
      System.out.println("NAME OF COURSE "+listOfCourses[i]+" MARK "+Mark[i]);   
    }
  }
}

主要方法:

public static void main(String[] args) {
  student S1 = new student(1000000001);
  S1.addCourse(200);
  S1.addCourse(201);
  S1.addCourse(202);
  S1.addMark(200, 100);
  S1.addMark(201, 99);
  S1.addMark(202, 98);
  student S2 = new student(1111111111);
  S2.addCourse(300);
  S2.addCourse(301);
  S2.addMark(300, 70);
  S2.addMark(301, 99);

  S1.print();
  S2.print();
}

输出

NAME OF student 1000000001  
NAME OF COURSE 200 MARK 100.0  
NAME OF COURSE 200 MARK 100.0  
NAME OF COURSE 200 MARK 100.0  
NAME OF student 1111111111  
NAME OF COURSE 300 MARK 70.0  
NAME OF COURSE 300 MARK 70.0

3 个答案:

答案 0 :(得分:2)

这就是给你带来麻烦的东西。第一次拨打电话时,您将CN分配给0到4的所有课程。

void addCourse(int CN){

for(int i=0 ; i<listOfCourses.length ; i++){
    if (listOfCourses[i]==0) {
    listOfCourses[i]=CN;  
    }
 }
 numCoures++; 
 }

建议

void addCourse(int CN){
 if (numCoures >= 5) return; // actually, you should throw an exception here

 listOfCourses[numCoures] = CN;
 numCoures++; 
}

答案 1 :(得分:0)

addCourse方法将listOfCourses的所有5个元素设置为第一个调用中提供的值。要解决此问题,您需要在使用 break 语句设置值后退出循环。否则,代码会遍历整个数组:

void addCourse(int CN) {
    for (int i = 0; i < listOfCourses.length; i++) {
        if (listOfCourses[i] == 0) {
            listOfCourses[i] = CN;
            break;
        }
    }
    numCoures++;
}

有更好的方法来实现此计划的目标。如果学生的课程超过5门,会发生什么?查找java.util.List和java.util.Map。

输出是:

NAME OF student 1000000001
NAME OF COURSE 200 MARK 100.0
NAME OF COURSE 201 MARK 99.0
NAME OF COURSE 202 MARK 98.0
NAME OF student 1111111111
NAME OF COURSE 300 MARK 70.0
NAME OF COURSE 301 MARK 99.0

答案 2 :(得分:0)

您的问题是addCourse()方法:

void addCourse(int CN) {
    for (int i = 0; i < listOfCourses.length; i++) {
        if (listOfCourses[i] == 0) {
            listOfCourses[i] = CN;
        }
    }
    numCoures++;
}

想想这里发生了什么。添加第一个课程时,数组全部为0。因此,条件listOfCourses[i] == 0将始终产生true,您将使用该课程编号填充整个数组。下次尝试添加课程时,条件将始终评估为false,因此没有任何变化(numCoures除外)。

这也意味着您可以经常致电addCourse()并将numCoures增加到一些不再具有任何意义的荒谬数字。

可能的解决方案

一个简单的解决方法是在添加新课程时实际使用numCoures

void addCourse(int CN) {
    if (numCoures < listOfCourses.length) {
        listOfCourses[numCoures++] = CN;
    }
}

在这里,我们首先检查numCoures是否仍然在数组的范围内。如果是这样,我们会在索引numCoures处插入给定的课程编号,这将是第一次0,依此类推。使用++作为后缀,在评估后也会增加

使用numCoures

的解决方案

但是,我建议您使用许多有用的Java集合之一替换普通数组(除非这是一个明确要求您使用普通数组的练习?)。例如,您可以使用HashMap。地图将键与值相关联。这似乎很适合您的情况:课程编号可以是关键,标记可以是值。

我们将声明如下:

HashMap

另外,请不要忘记您的文件顶部需要private HashMap<Integer, Float> courses = new HashMap<>();

您的import java.util.HashMap;方法可能会变为:

addCourse()

void addCourse(int courseNum) { courses.put(courseNum, null); } 将成为:

addMark()

如果您查找void addMark(int courseNum, double mark) { courses.replace(courseNum, mark); } 的{​​{1}}和HashMap方法,您会注意到我们可以在{{1}中使用put()同样,但我觉得你的意图更加清晰。

现在应该更改另外两种方法:

replace()

我会将put()留给您。

此外,你现在可以摆脱这三个,因为它们被我们整洁的addMark()所取代:

int getNumCourses() {
    return courses.size();
}

使用print()

的好处
  • 学生可以有超过5门课程
  • 您的代码变得更短,更易于阅读
  • 您的代码也不容易出错
  • 很容易更改或删除课程或成绩

附加说明:

您应该更加关注类,变量和方法的名称。我会指出我注意到的事情:

  • 班级HashMap应为private int[] listOfCourses = new int[5]; // bye bye private double[] Mark = new double[5]; // cya private int numCoures; // sayounara (班级应以大写字母开头)
  • 变量Map应为student(变量应以小写字母开头)
  • 方法Student应该是Mark)(方法应该是camelCase而你错误输入课程
  • 变量mark和方法getnumCoures()可以简化为getNumCourses()student_ID - 我们已经知道我们正在与学生打交道!