如何从Java

时间:2018-10-20 20:08:44

标签: java arrays

我需要创建一种方法,以删除具有变量grade = 1的对象数组中的所有对象,并返回“调整大小”的对象数组。

对象看起来像这样:

public class Exam {
   private Course course; // Course is a class
   private Student student; // Student is a class
   private Integer grade;
   private LocalDateTime date; }

public class Student{
    private String id;
    private LocalDate birthDate; }

public class Course {
   private String id;
   private String name;
   private Integer ECTS;
   private Profesor subjectBearer;
   private Student[] student;}

该方法需要如下所示:

private Exam[] filterPassedExams(Exam[] exams) { ...}

在不使用列表的情况下解决问题的任何帮助或建议都很棒[在课程中我们还没有学习列表,因此我们无法真正使用它们 (但是我想知道该解决方案,如果将来使用起来更快)]。

4 个答案:

答案 0 :(得分:1)

我将对数组进行流处理,过滤需要保留的检查,然后将流转换回数组:

private Exam[] filterPassedExams(Exam[] exams) {
    return Arrays.stream(exams).filter(e -> e.grade.intValue() != 1).toArray(Exam[]::new);
}

答案 1 :(得分:1)

我的方法是遍历exams并立即将通过的考试收集到新的数组passedExams中:

  private Exam[] filterPassedExams(Exam[] exams) {
    Exam[] passedExams = new Exam[exams.length];
    int size = 0;
    for (Exam exam : exams) {
      if (exam.getGrade() != 1) {
        passedExams[size++] = exam;
      }
    }

    return size == exams.length ?
      exams :
      Arrays.copyOf(passedExams, size);
  }

由于所有考试都可以通过,因此新数组passedExams的长度为exams初始化。如果所有考试都通过了,我们将返回原始数组。否则,我们将使用passedExams来调整Arrays.copyOf数组的大小,这将返回一个具有计数的size的新数组。

由于数组的大小固定,因此无法删除元素。元素可以设置null,但不能删除。因此,不可能调整数组的大小。必须创建一个具有过滤元素的新数组。

答案 2 :(得分:0)

private Exam[] filterPassedExams(Exam[] exams) {    
    int size = 0;
    for(int i=0;i<exams.length;i++){
        if(exams[i].getGrade() != 1)
            size++;
    }
    Exam[] tmp = new Exam[size];
    size=0;
    for(int i=0;i<exams.length;i++){
        if(exams[i].getGrade() != 1)
            tmp[size++] = exams[i];
    }   

    return tmp;
}

答案 3 :(得分:0)

Java总是按值传递。您的exams数组是您发送的参数的副本。 无论如何,由于您不应该使用列表,因此可以运行循环并检查成绩是否不为1,请保留一个计数器。然后创建一个具有计数器大小的新数组。再次过滤exams数组,这次将传递的对象分配给新创建的数组。返回过滤后的数组。

private Exam[] filterPassedExams(Exam[] exams) {
    int size = 0;
    for(int i=0; i<exams.length; i++)
         if(exam[i].getGrades !=1)
           size++;

    Exam[] filteredExams = new Exam[size]; //create a new array

    size = -1; //lets reuse this

    for(int i=0; i<exams.length; i++)
         if(exam[i].getGrades !=1)
           filteredExams[++size] = exam[i]; // assign the passed exam object to new filtered exam array

    return filteredExams;
}