0
public void addClimb(String peakName, int climbTime){ 
  for(int i = 0; i < climbList.size()-1; i++){
    if(peakName.substring(0,1).compareTo(climbList.get(i).getName().substring(0,1)) <= 0){
             climbList.add(i, new ClimbInfo(peakName, climbTime));   
         } else {
             climbList.add(new ClimbInfo(peakName, climbTime));
         }
     }
 } 

目標は、peakName とclimbTime を取り込ませ、climbList の ClimbTime オブジェクトをループさせ、ループ内でパラメーターの最初の文字が ClimbTime の最初の文字の前に来るタイミングをチェックし、すぐにそれを配置することです。それは起こりますが、いくつかの ClimbInfo を入力してそれらを印刷しようとすると、範囲外のエラーが発生します。このメソッドは、ClimbInfo を ClimbTime に適切に挿入していません。

誰かが私が間違っていることを説明できますか?

4

4 に答える 4

0

基本的に、リスト全体をループして、ループするたびにレコードを追加します。おそらく次のようなものが必要です。

public void addClimb(String peakName, int climbTime){ 
  for(int i = 0; i < climbList.size(); i++){
    if(peakName.substring(0,1).compareTo(climbList.get(i).getName().substring(0,1)) >= 0){
       climbList.add(i, new ClimbInfo(peakName, climbTime));
       return;
    }
  }

  climbList.add(new ClimbInfo(peakName, climbTime));

 } 
于 2013-05-07T02:11:29.897 に答える
0

あなたは何が問題なのかを説明できませんでした。

このメソッドは、ClimbInfo を ClimbTime に適切に挿入していません。

何が起こるか教えてくれません。実行時例外? コンパイルエラー?それとも、最後に空のコレクションが残っていますか?

例外が発生した場合は、スタック トレースと共に含めてください。

空のコレクションがあると仮定すると、それが意味することは 1 つだけです。つまり、for ループの条件に決して達しないということです。if ステートメントには挿入する else があるため、これは確かに言えます。したがって、ループのすべての反復で挿入が保証されます。したがって、ループは反復してはなりません。

サイズチェックだと思います。

for(int i = 0; i < climbList.size()-1; i++){

この論理は、次の 2 つの理由からほぼ確実に間違っています。

  1. 空のコレクションから開始すると、climbList.size() = 0 となり、climbList.size() - 1 = -1 になります。0 は -1 以上であるため、条件が失敗し、ループが終了します。
  2. 空でないリストから始めると仮定すると、実際には挿入されます。ただし、ループの反復ごとにサイズが再チェックされますが、ループ内では追加されています。基本的に、「上昇リストのすべての要素について、上昇リストに要素を追加する」と言っています。空のリストから始めない限り、ある時点でメモリ不足になります。
于 2013-05-07T02:13:47.903 に答える
0

反復中にリストを変更しないでください。

ここで達成しようとしているのはカスタムソートだと思います。そのためには、 Comparable インターフェイスを に実装しClimbInfoて使用する必要がありますCollections.sort(climbList)

詳しくはこちらこちらをご覧ください。

于 2013-05-07T02:23:54.590 に答える