我在编写这个实例方法时遇到了麻烦。我正在尝试编写方法,以便该方法检查是否有其他竞争对手的空间。如果有,将在下一个可用的插槽中添加另一个竞争对手。
public boolean addCompetitor(Competitor competitor) {
// TODO
for(int i=0;i<competitors.length; i++){
if(numberOfCompetitors < MAX_COMPETITORS){
numberOfCompetitors++;
return true;
}
}
return false;
}
我已经做了一个循环,看看如果条件满足,我是否可以将变量添加到数组中。
这是完整的错误输出。
java.lang.NullPointerException
at Race.finishRace(Race.java:71)
at TestA2Classes.start(TestA2Classes.java:46)
at TestA2.main(TestA2.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
完整代码:
public class Race {
public static final String[] RACE_DESCRIPTIONS = {"Sprint", "Distance", "Eliminator", "Keirin"};
public static final int SPRINT = 0;
public static final int DISTANCE = 1;
public static final int ELIMINATOR = 2;
public static final int KEIRIN = 3;
public static final int MAX_COMPETITORS = 8;
private int number;
private int typeIndex;
private MyDate date;
private boolean hasFinished;
private Competitor[] competitors;
private int numberOfCompetitors;
public Race(int number, int typeIndex, MyDate date) {
// TODO
this.number = number;
this.typeIndex = typeIndex;
this.date = date;
this.hasFinished = false;
this.numberOfCompetitors = 0;
this.competitors = new Competitor[MAX_COMPETITORS];
}
public int getNumber() {
// TODO
return number;
}
public boolean getHasFinished() {
// TODO
return hasFinished;
}
public int getTypeIndex() {
// TODO
return typeIndex;
}
public MyDate getDate() {
// TODO
return date;
}
public Competitor getCompetitor(int number) {
// TODO
for(int i=0; i<competitors.length; i++){
if(competitors[i].getNumber() == number){
return competitors[i];
}
}
return null;
}
public void finishRace(int first, int second, int third) {
// TODO
this.hasFinished = true;
for(int i=0; i<competitors.length; i++){
if(competitors[i].getNumber() == first){
competitors[i].setPosition(1);
} else if(competitors[i].getNumber() == second){
competitors[i].setPosition(2);
} else if(competitors[i].getNumber() == third){
competitors[i].setPosition(3);
} else{
competitors[i].setPosition(0);
}
}
}
public boolean addCompetitor(Competitor competitor) {
// TODO
if(numberOfCompetitors < MAX_COMPETITORS){
competitors[numberOfCompetitors] = competitor;
numberOfCompetitors++;
return true;
}
return false;
}
public String toString() {
// TODO
String details = number + ", " + RACE_DESCRIPTIONS[typeIndex] + " [" + date + "]";
if(!hasFinished){
details += ": Race not finished";
} else if(hasFinished){
details += "\n 1st: " + competitors[0].getName();
details += "\n 2nd: " + competitors[1].getName();
details += "\n 3rd: " + competitors[2].getName();
} else{
details += "n/a";
}
return details;
}
}
答案 0 :(得分:3)
就目前而言,如果你的for循环中你的条件是假的,那么在所有的迭代中它都是假的,而你只是浪费了计算时间。它本身的if语句就足够了。
public boolean addCompetitor(Competitor competitor) {
if(numberOfCompetitors < MAX_COMPETITORS)
{
competitors[numberOfCompetitors++] = competitor;
return true;
}
return false;
}
您知道到目前为止您输入了多少竞争对手。你不需要循环,只需检查你是否直接添加了太多。
如果您尚未保存已添加的竞争对手数量,则需要循环(这要求合法条目不能为空,否则将被覆盖): < / p>
public boolean addCompetitor(Competitor competitor)
{
for(int i = 0 ; i < competitors.length ; i++)
{
if(competitors[i]==null)
{
competitors[i] = competitor;
return true;
}
}
return false;
}
这种方法需要的时间越长,你添加的竞争对手越多(O(n)),而另一种方法总是花费相同的时间(O(1))
解决新修改中的错误
for(int i=0; i<competitors.length; i++){
你正在遍历整个竞争对手阵列,这可能还没有竞争对手。
尝试将其更改为
for(int i=0; i<numberOfCompetitors; i++){
答案 1 :(得分:0)
如果数组的长度大于Competitor
,我愿意打赌您要向Competitor[]
添加新的numberOfCompetitors
。这是一种方法,无需遍历数组:
public boolean addCompetitor(Competitor competitor) {
boolean result = false;
if(numberOfCompetitors < competitors.length) {
result = true;
competitors[numberOfCompetitors++] = competitor;
}
return result;
}