2012-04-21 4 views
1

以下のクラスは、行単位でインデックスを付けることを目的としています。 エラーをスローしているメソッドは、現在のインデックスに別のドキュメントのインデックスを追加するためのものです。それは私が間違って何をやっている最初の文書での6行がある場合は、追加文書の最初の行は7ArrayListを持つループごとにNoSuchElementExceptionが発生する<Integer>

public class DocumentIndex { 
    // a NavigableMap implementation to store indexed words and their locations 
    private TreeMap<String, ArrayList<Integer>> map = new TreeMap<String, ArrayList<Integer>>(); 

    /** 
    * A method to append another index onto the main index 
    * @param  indexAppendix  the additional index to be appended onto the main index 
    */ 
    public void append(DocumentIndex indexAppendix){ 
    if(indexAppendix == null){ 
     throw new NullPointerException(); 
    } 
    Integer docEnd = 0;         // the last line recorded in the main index 
    Set<String> set = map.keySet();      // a Set of the key values from map 
    //select each key 
    for(Iterator<String> iter = set.iterator(); iter.hasNext();){ 
     String key = iter.next();      // the current key value 
     // for each key select contents and determine the highest value 
     for(Iterator<Integer> iter2 = this.find(key).iterator(); iter2.hasNext();){ 
      Integer compare = iter2.next();    // the key index current value 
      if(compare>docEnd){ 
       docEnd=compare; 
      } 
     } 
    } 

    // for each key find an index value 
    for(Iterator<String> iter = set.iterator(); iter.hasNext();){ 
     String key = iter.next();      // the current key value 
     // for each index value map that value adjusting for the length of the original document 
     ArrayList<Integer> toAdd = new ArrayList<Integer>(); 
     for(Iterator<Integer> iter2 = this.find(key).iterator(); iter2.hasNext();){ 
      Integer addIter = iter2.next(); 
      toAdd.add(addIter); // the current index value 
     } 

     /** 
     *Below is the loop in which the error is thrown 
     */ 
     for(Iterator<Integer> iter3 = toAdd.iterator(); iter.hasNext();){ 

      Integer addIter = iter3.next();  // The error is thrown on this line 

      map.get(key).add(addIter+docEnd); 
     } 
    } 
} 

ラインとしてインデックス付けされなければならない、ですか?

答えて

3

問題のループ内のループ条件は、iter.hasNext()ではなくiter3.hasNext()である必要があります。

4

ルイスワッサーマンがそれを釘付けにしました。

「新しい」Java forループ構文を使用した場合、コードはかなりシンプルになりますが、そのコードを間違えたことはありません最初の場所。たとえば、ここにあなたのコードは、「新しい」for構文でどのように見えるか大体です:

... 
    Integer docEnd = 0; 
    Set<String> set = map.keySet(); 
    for (String key : set) { 
     for (Integer compare : this.find(key)) { 
      if (compare < docEnd){ 
        docEnd = compare; 
      } 
     } 
    } 

    for (String key : set) { 
     ArrayList<Integer> toAdd = new ArrayList<Integer>(); 
     for (String add : this.find(key)) { 
      toAdd.add(add); 
     } 
     for (Integer add : toAdd) { 
      map.get(key).add(add * docEnd); 
     } 
    } 

はそのあまり読みやすくはありませんか?


この構文は、それはすべての練習Javaプログラマの標準reportoireの一部である必要があり、2004年にリリースしたのJava 5で導入されましたので、私は引用符で「新しい」を入れ

...とインストラクター...によって今。

上記のコードはコピーして貼り付けないでください。私の要点を説明することだけを目的としています。

+0

+1インストラクターは常に最新の状態に保つ必要があります。 – Fuhrmanator

+0

@Fuhrmanator - 公平であるために、私たちはオキャスカのインストラクターが間違っているかどうかわかりません。 –

+0

インストラクターとして、「新しい」javaの後に私の宿題を更新しないというのは罪がありました。どこかのインストラクターが構文に "新しい"を使用していない... – Fuhrmanator

関連する問題