2013-05-07 86 views
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的第一個字母之前,以及放置它,只要發生這種情況,但當我進入幾個ClimbInfos並嘗試打印它們時,即時發生越界錯誤。此方法沒有正確地將ClimbInfo正確插入到climbTime中。此方法未將對象插入到ArrayList中。爲什麼?

有人可以解釋我在做什麼錯嗎?

+0

你爲什麼說它沒有正確插入?你有錯誤嗎?如果不是,在這個方法之後你的數組內容是什麼樣的? – SOfanatic 2013-05-07 02:04:38

+0

對不起,我的意思是說它根本沒有插入。我得到一個越界異常,並且編譯器似乎告訴我,我的數組大小爲0. – 2013-05-07 02:07:44

+0

您應該添加顯示數組聲明的代碼,以及出現「越界異常」的行。 – SOfanatic 2013-05-07 02:09:19

回答

4

根據初始條件,你的函數將做兩件事情之一:

  • 如果climbList最初是空的,或者最初僅包含一個元素,那麼測試i < climbList.size() - 1會失敗,所以該函數將立即返回, 什麼也不做。
  • 如果climbList最初包含多個元素,則測試i < climbList.size() - 1將始終成功,因爲每次通過循環都會將一個元素添加到climbList,並且將使i增加1。所以i < climbList.size() - 1在迭代之前是真實的,那麼在迭代之後它將是真實的。所以你有一個無限循環。

我不認爲這些都是你想要的。

+0

其實,如果climbList最初是空的,它將一直保持空着! – 2013-05-07 02:10:19

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

} 
+0

此外,for循環的終止表達式不應該包含「-1」或需要更改爲<=。 – 2013-05-07 02:37:26

+0

正確的彼得,應該看起來更接近 – 2013-05-07 07:14:49

0

您未能解釋問題所在。

此方法沒有正確地將ClimbInfo正確插入到climbTime中。

不告訴我會發生什麼。運行時異常?編譯錯誤?或者你最後留下了一個空集合?

如果您收到一個異常,請將其與堆棧跟蹤一起包括在內。

如果我們假設您有一個空集合,那隻能意味着一件事情:for循環條件永遠不會達到。我可以肯定地告訴這個,因爲if語句有其他的插入。因此,循環的每次迭代都保證插入。因此,循環不能迭代。

我懷疑這是尺寸檢查。

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

這個邏輯幾乎肯定是錯誤的,原因有二:

  1. 如果你開始與一個空集,然後climbList.size()= 0,這意味着climbList.size() - 1 = -1。 0不小於-1,因此您的條件失敗並退出循環。
  2. 假設你從一個非空列表開始,那麼你實際上會插入。但是,循環的每次迭代都會重新檢查大小,但在循環中您正在追加。從本質上講,你在說「對於攀登列表中的每個元素,添加一個元素到攀登列表」。在某些情況下,這會耗盡內存,除非您以空列表開始。
0

您不應該在迭代它時修改列表。

我假設你在這裏試圖實現的是自定義排序。爲此,您必須在ClimbInfo中實現Comparable接口並使用Collections.sort(climbList)

閱讀全文herehere

相關問題