2015-06-01 39 views
1

我目前正在學習Java編程語言,我需要幫助瞭解ArrayList類的大小方法。在問這個問題之前,讓我解釋一下這個程序。Java - ArrayList - .size()方法

該程序查找班級成績的平均值。

我的問題是關於ArrayList類的大小方法。在For-Loop中,關係表達式「I < grades.size()」將運行「i」,直到它小於數組的大小。我被告知,數組的大小總是比數組中元素的數量多一個,所以在我的情況下,考慮到我的數組中有3個元素(等級),實際上我的數組大小爲4(類似以及字符串如何工作)。請注意,在我離開For-Loop之後,我可以用尺寸方法適當地計算出我的平均值。我很困惑,因爲如果數組的大小比元素的數量多一個,那麼它會不會僅僅除以4而不是3?爲什麼規則在For-Loop中的功能不同?感謝任何願意爲此澄清的人。

import java.util.ArrayList; 


public class Chap11Part1 

    public static void main(String[] args) 
    { 
     double average; 
     int total = 0; 
     ArrayList<Integer> grades = new ArrayList<Integer>(); 
     grades.add(78); 
     grades.add(84); 
     grades.add(90); 
     for(int i = 0; i < grades.size(); ++i) 
      total += grades.get(i); 
     average = total/grades.size(); 
     System.out.println("The average is " + average); 
+1

尺寸是完全一樣的元素的個數。需要注意的是他們數從0開始,而不是1 –

+1

沒有括號(你的for循環)=在未來 –

+2

@RC可能出現的麻煩。 – Lrrr

回答

3

該數組的大小與元素數相同。唯一需要記住的是索引從0開始;所以,最後的指數將大小1:

import java.util.ArrayList; 

public class Chap11Part1 { 

    public static void main(String[] args) { 
     double average; 
     int total = 0; 
     ArrayList<Integer> grades = new ArrayList<Integer>(); 
     grades.add(78); 
     grades.add(84); 
     grades.add(90); 
     for (int i = 0; i < grades.size(); ++i) 
      total += grades.get(i); 
     average = total/grades.size(); 
     System.out.println("The average is " + average); 
    } 
} 
+0

我會在for循環之前添加一個println以清楚地顯示數組的大小。這將有助於澄清國際海事組織。 –

+0

我想我現在明白了。我在For-Loop的零點開始「我」。作爲Rajesh的狀態,等級的大小將由相同數量的元素返回。第一個元素從零開始,我希望循環在3之前停止,因爲我沒有第三個隔間中的元素,所以我無法從該隔間獲取任何東西來添加到我的總數中。那時,我的循環應該停止。在我的平均計算中使用它是可以接受的,因爲它返回元素的數量。感謝大家幫助我,理解編程風格! –

0

正如已經指出的那樣,你有一個困惑的是從這裏開始:

我奉命該數組的大小始終是一個超過數組中的元素數量,所以在我的情況下,假設我有3個元素(等級)在我的數組中,我實際上有一個數組大小爲4(類似於字符串的工作方式)。

這個誤解是否是教師解釋事情的一部分,或者你誤解了這個意思是無關緊要的。這種理解是你的困惑和最終問題的根源。

你是對的。和ArrayListsize函數將返回1多東西,類似於String也如何工作。那東西是最大的索引。數組(最終是ArrayList s,它只是一個在底層數組頂部實現的數據結構)具有索引值,其起始於0(不像1,就像您在計數時一樣)。這意味着,如果你有三個數字,你最終會得到這樣的:

numbers[0] = 10 
numbers[1] = 108 
numbers[2] = 309 

(忽略僞代碼的語法,括號注意值這裏)

如果我是得到size(或length與某些類型)我會得到3。你可以清楚地看到只有3個數字顯示。 「多一個」方面比最大指數多一個。這裏的最大指數是2,因爲我們從0開始計數(指數式)。

這個問題我已經從新開發商看到的比較常見的,當你想,你可以嘗試list.get(1)列表的第一個元素它通常被稱爲「差一錯誤」或OBO錯誤當時這實際上是第二個元素的列表,.get(0)將是第一個。

所以現在...

您的ArrayList,以.size通話將給予3個元素(如你應該期待)的數量3的回報。你的循環比較的是這樣的:

Iteration 1: i = 0; 0 < 3 == true; execute body 
Iteration 2: i = 1; 1 < 3 == true; execute body 
Iteration 3: i = 2; 2 < 3 == true; execute body 
Iteration 4: i = 3; 3 < 3 == false; jump over body 

正如你所看到的,你的病情檢查的時間(在這種情況下,4),但只有3倍,實際數目「比元素的數量多了一個」元素,是循環體執行還是運行。如果你不小心用<=代替,你會通過訪問得到OBO錯誤「一比列表中包含」。這就是爲什麼有這個整體把握「從0開始」計數系統將是關鍵,以及認識到大小或位置往往比索引值的一大。

如果這任何部分較爲混亂比它應該是,讓我知道,我會嘗試修復它。

0

您的數組中的元素(78,84,90)進行計數以得到所述陣列,它是3(比最大下標多一個),你應該知道什麼的大小/長度是索引(的位置每個元素),從0開始。所以在你的列表中,78是在1指數爲0,84和90在2

我覺得你應該多看一些關於Arrays的各種方法和List S和也的區別++ii++