-2

このインスタンス メソッドの作成に問題があります。別の競合他社用のスペースがあるかどうかをメソッドがチェックするように、メソッドを作成しようとしています。ある場合は、次の利用可能なスロットに別の競合他社が追加されます。

    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;
}

}

4

2 に答える 2

3

現状では、for ループで条件が false の場合、すべての反復で false になり、計算時間を無駄にしているだけです。if ステートメントだけで十分です。

public boolean addCompetitor(Competitor competitor) {
    if(numberOfCompetitors < MAX_COMPETITORS)
    {
        competitors[numberOfCompetitors++] = competitor;
        return true;
    }
    return false;
}

これまでに参加した競合他社の数がわかります。ループは必要ありません。直接追加した回数が多すぎるかどうかを確認してください。

このように追加した競合他社の数をまだ保存していない場合は、ループが必要になります (これには、正当なエントリを null にすることができないか、上書きする必要があります)。

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++){
于 2013-10-02T13:02:09.777 に答える
0

配列の長さCompetitorが. 配列全体を反復せずに、これに対するアプローチを次に示します。Competitor[]numberOfCompetitors

public boolean addCompetitor(Competitor competitor) {
    boolean result = false;
    if(numberOfCompetitors < competitors.length) {
        result = true;
        competitors[numberOfCompetitors++] = competitor;
    }
    return result;
}
于 2013-10-02T13:01:46.917 に答える