0

ベクトルに取り組んでいる comp 182 クラスのプロジェクトがありますが、「順序付けられたベクトル」の作成に行き詰まっています。実行しようとすると、ArrayOutofBounds エラーが発生します。

(「howMany」変数は、配列「theWords」内の文字列のサイズのカウントです。
コードは、この「addWord」メソッドを使用して単語を追加する、10 単語を含む入力ファイルを読み取る別のクラスから実行されます。ファイルから「theWords」配列に入れます。)

これまでのところ、私が持っているコードは次のとおり
です。

 public void addWord(String newWord) {
  //adds in words
     if (howMany < theWords.length) {
        theWords[howMany]= newWord; 
        howMany++;
     }  
     else {
        String t [] = new String[capacity+10];
        for (int i=0; i <capacity; i++){
           t[i] = theWords[i];
        }
        theWords = t;
        theWords[howMany] = newWord; 
        howMany++;
     }

    //ordering words
     for(int g = howMany - 1, z = howMany ; g < howMany; g--, z--) {
        if(newWord.compareTo(theWords[g]) < 0) {
           theWords[g] = theWords[z];
           theWords[g] = newWord;
        }
            else
            newWord = theWords[z];          
     }
        howMany++;
  }

どんな助けでも大歓迎です!

4

2 に答える 2

2

アレイの容量に応じて、ステートメント

theWords[g] = theWords[z]

z =配列の長さ(配列の最後のインデックスは長さ-1)であるため、ループの最初の実行で失敗します。ちなみに、ループでは、最初に設定します

g = howMany - 1

次にそれをデクリメントするので、g<howManyは常に真になります...無限ループになります。この無限ループにより、gまたはzが0を下回ると、インデックスが範囲外の例外になる可能性もあります。

于 2012-09-27T23:06:48.297 に答える
1

howMany == capacity - 1関数が実行される前に問題があります。

何が起こるか: if (//adds in words) の最初の分岐に移動し、次にhowManywhich become をインクリメントし、その境界外の配列howMany = capacityに割り当ててアクセスします: 。z = howManytheWords[g] = theWords[z];

capacityもう 1 つのことは、変数をインクリメントしないことですcapacity+=10

ここに私の変種があります:

import java.util.Arrays;
import java.util.Random;
public class OrderedArray{

  int howMany = 0;
  String[] theWords = new String[10];

  public void addWord(String newWord) {

    //don't accept nulls
    if(newWord == null) {
      return;
    }
    //if length is reached increase the array
    if(howMany >= theWords.length - 1) {
      theWords = Arrays.copyOf(theWords, theWords.length+10);
    }

    //go through existing words and add newWord if it is less then met value
    boolean isAdded = false;
    for(int idx = 0; idx < howMany && theWords[idx] != null; idx++){                                                          
      if(newWord.compareTo(theWords[idx]) < 0){
        isAdded = true;
        String valToShift = theWords[idx];
        theWords[idx] = newWord; 

        //copy all values after the met index
        for(int shIdx = idx+1; shIdx <= howMany && shIdx < theWords.length; shIdx++){
          String tmp = theWords[shIdx];
          theWords[shIdx] = valToShift;
          valToShift = tmp;
        }        
        break;
      }
    }

    //if a value was not added then add it
    if(!isAdded){
      theWords[howMany] = newWord;
    }
   ++howMany;
  }

  public String toString(){
    StringBuffer sb = new StringBuffer("howMany:");
    sb.append(howMany);
    for(int idx = 0; idx < howMany; idx++){
      sb.append(",");
      sb.append(theWords[idx]);
    }
    return sb.toString();
  }


  public static void main(String[] args){
    OrderedArray m = new OrderedArray();
    Random r = new Random(System.currentTimeMillis());
    for(int i = 0; i < 210; i++){
      m.addWord(Math.abs(r.nextInt())+ "");
    }
    System.out.println(m);

    OrderedArray m1 = new OrderedArray();

    m1.addWord("c");
    m1.addWord("d");
    m1.addWord("a");
    m1.addWord("cd");

    System.out.println(m1);

  }

}
于 2012-09-27T23:14:45.263 に答える