我需要创建一种方法,以删除具有变量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) { ...}
在不使用列表的情况下解决问题的任何帮助或建议都很棒[在课程中我们还没有学习列表,因此我们无法真正使用它们 (但是我想知道该解决方案,如果将来使用起来更快)]。
答案 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;
}