不允许使用Arraylist或Comparator 只允许一个循环我对如何在'M'之后立即返回'F'感到困惑。smb能帮上忙吗?如何在SINGLE循环中返回一个人的"M",然后立即返回同一个人的他的"F"。该方法返回一个数组,该数组以第一个人(对象)的"M"(中期)开头,紧接着是他的"F"(最终)。比方说。。最初看起来是这样的:
| Index | First | Last | ID | ExamType | Score |
|-------+--------+-----------+----+----------+-------|
| 0 | Linus | Torvalds | 9 | final | 91 |
| 1 | Brian | Kernighan | 6 | midterm | 90 |
| 2 | Donald | Knuth | 3 | midterm | 100 |
| 3 | Grace | Hopper | 0 | final | 80 |
| 4 | James | Gosling | 5 | final | 90 |
| 5 | James | Gosling | 5 | midterm | 100 |
| 6 | Brian | Kernighan | 6 | final | 80 |
| 7 | Dennis | Ritchie | 4 | final | 80 |
| 8 | Dennis | Ritchie | 4 | midterm | 90 |
| 9 | Grace | Hopper | 0 | midterm | 100 |
| 10 | Donald | Knuth | 3 | final | 90 |
| 11 | Linus | Torvalds | 9 | midterm | 90 |
该方法的最终产品应该是:
| Index | First | Last | ID | ExamType | Score |
|-------+--------+-----------+----+----------+-------|
| 0 | Brian | Kernighan | 6 | midterm | 90 |
| 1 | Brian | Kernighan | 6 | final | 80 |
| 2 | Donald | Knuth | 3 | midterm | 100 |
| 3 | Donald | Knuth | 3 | final | 90 |
| 4 | James | Gosling | 5 | midterm | 100 |
| 5 | James | Gosling | 5 | final | 90 |
| 6 | Dennis | Ritchie | 4 | midterm | 90 |
| 7 | Dennis | Ritchie | 4 | final | 80 |
| 8 | Grace | Hopper | 0 | midterm | 100 |
| 9 | Grace | Hopper | 0 | final | 80 |
| 10 | Linus | Torvalds | 9 | midterm | 90 |
| 11 | Linus | Torvalds | 9 | final | 91 |
我的代码:
public static Exam[] collateExams(Exam[] exams)
{
Exam [] r = new Exam[10];
r = exams;
int[] position = new int[10];
int index = 0;
for(int i = 0; i < exams.length; i++)
{
if(r[i].getExamType() == 'M')
{
r[index*2] = new Exam(r[index].getFirstName(), r[index].getLastName(),
r[index].getID(), r[index].getExamType(), r[index].getScore());
position[index*2] = r[index].getID();
index++;
if((r[index+1].getExamType() == 'F') && (position[index+1] == r[i].getID()))
{
r[index+1] = new Exam(r[index].getFirstName(), r[index].getLastName(),
r[index].getID(), r[index].getExamType(), r[index].getScore());
}
/*if(position[i].getID() == r[i].getID())
r[i] = new Exam(r[i].getFirstName(), r[i].getLastName(),
r[i].getID(), r[i].getExamType(), r[i].getScore());
*/
}
}
return r;
}
您的任务是从给定的输入中返回一个已排序的Exam
数组,并根据考试类型进行排序。基本上,您需要第一次循环使用exams
数组,并保存具有期中考试类型的每个条目。在执行此操作的同时,还要为该人员保存预期的最终索引。然后,您将再次循环使用exams
数组,使用保存在HashMap
中的索引保存具有期末考试类型的每个条目。我没有测试代码,但我评论了它,所以你应该理解它。
public static Exam[] collateExams(Exam[] exams){
Exam [] r = new Exam[exams.length];
// used to keep track of the person's ID and the index in the return array
Map<Integer, Integer> finalIndices = new HashMap<Integer, Integer>();
int midtermIndex = 0;
// first loop, saves only midterm
for(int i = 0; i < exams.length; i++) {
// midterm comes first, so its index in the array is always even
// final comes after midterm, so its index is always odd
if(exams[i].getExamType() == 'M') {
// midterm found, save in r
r[midtermIndex] = new Exam(exams[i].getFirstName(), exams[i].getLastName(),
exams[i].getID(), exams[i].getExamType(), exams[i].getScore());
// save the final index position for this person (midtermIndex + 1)
finalIndices.put(exams[i].getID(), midtermIndex+1);
// increment by 2,
midtermIndex+=2;
}
}
//second loop, saves final
for(int i = 0; i < exams.length; i++) {
if(exams[i].getExamType() == 'F') {
// final found, get the index from hashmap and save in r
int finalIndex = finalIndices.get(exams[i].getID());
r[finalIndex] = new Exam(exams[i].getFirstName(), exams[i].getLastName(),
exams[i].getID(), exams[i].getExamType(), exams[i].getScore());
}
}
// should be sorted
return r;
}
祝你好运,如果这有帮助,请告诉我。