2012-04-21 16 views
1

下面的類是爲了索引逐行的位置。 引發錯誤的方法意味着在當前索引上附加單獨文檔的索引。也就是說,如果有6條線路的頭文件,附加文件的第一行應該被索引爲7行NoSuchElementException中的每個循環與ArrayList <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

有問題的循環中的循環條件應爲iter3.hasNext(),而不是iter.hasNext()

4

Louis Wasserman已經釘了它。

我只想指出,如果您使用了「新」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 5中,其是在2004年發佈它應該是所有執業Java程序員的標準reportoire的部分介紹...和教師通過...現在。

請不要複製並粘貼上面的代碼。這只是爲了說明我的觀點。

+0

+1因爲導師應該跟上! – Fuhrmanator 2012-04-21 01:45:38

+0

@Fuhrmanator - 公平地說,我們不知道Ocasta的教練是否有過錯。 – 2012-04-21 07:25:12

+0

作爲一名指導老師,即使在我正式使用它之後,我仍然沒有在「新」java :)之後更新我的作業。某處的某位講師未使用「新的」語法... – Fuhrmanator 2012-04-21 14:15:27