2013-07-23 42 views
0

我正在嘗試創建一個非常非常簡單的程序。 我希望我的課程名爲Text只需打印出一個字符串,特別是一個字母。 然後在我的第二個名爲Window的類中,我想創建該類的ArrayList,遍歷列表並調用我的Text類的方法來打印出字符串。但它不打印任何東西。我不理解ArrayList或者我錯過了什麼?

我在做什麼錯?

public class Text { 

    private String a; 

    public void printA() { 
     a = "a"; 
     System.out.print(a); 
    } 

} 

和其他類..

import java.util.ArrayList; 

public class Window { 

    private ArrayList<Text> string = new ArrayList<Text>(5); 

    public Window() { 
     addText(); 
    } 

    public void iterate() { 
     for (int i = 0; i < string.size() - 1; i++) { 
      string.get(i).printA(); 
     } 
    } 

    public void addText() { 
     for (int i = 0; i <string.size() - 1; i++) { 
      string.add(new Text()); 
     } 
    } 

    public static void main(String[] args) { 
     Window wind = new Window(); 
     wind.iterate(); 
    } 

} 
+6

'新的ArrayList (5)'不會做你認爲它;檢查Javadocs ... –

+0

類窗口不擴展文本類 - 你想如何調用printA()方法? – DRastislav

回答

0

如果修改迭代到:

public void iterate(){ 
    System.out.println(string.size()-1); 
    for(int i = 0; i < string.size()-1;i++){ 
     string.get(i).printA(); 

    } 
} 

你會得到-1

讓我來解釋爲什麼:

每個ArrayList實例都有一個容量。容量是用於存儲列表中元素的數組大小。它總是至少與列表大小一樣大。 private ArrayList<Text>string = new ArrayList<Text>(5);僅設置實現ArrayList對象的數據結構的底層數組的容量。大小()返回的ArrayList不是capcity的內部對象的數量

public void addText(){ 
    for(int i = 0; i <string.size()-1;i++){ 
     string.add(new Text()); 

    } 
} 

for循環的表達式的值不爲真,因此,你從來就不是一個單一的對象添加到循環這就是爲什麼迭代將打印-1如果添加有

+0

謝謝你的大力支持。我有很多帖子想選擇作爲答案,但我只能選擇一個。我讀了所有這些。謝謝大家。 – Anon84858789

-2

打印語句你在做什麼錯的是你創建的ArrayList爲5的能力,但還沒有在這5個對象。因此,addText方法什麼都不做。這裏是可用的版本:

public void addText(){ 
    for(int i = 0; i < 4; i++){ 
     string.add(new Text()); 
    } 
} 

注意string.size() - 1已更改爲4,監守string.size()爲0,你要添加4個元素的列表。此外,您iterate方法可以使用一個小的重構:

public void iterate(){ 
    for(Text text : string){ 
     string.get(i).printA(); 
    } 
} 

而不是一個簡單的循環,增強for來代替。這不過是一個打字快捷鍵,但它提高了效率,可用於LinkedList

+0

這不會編譯,因此*不*工作。此外,你沒有回答這個問題*「我做錯了什麼?」*。 – arshajii

+0

我很匆忙。我會更新我的答案。 – tbodt

2
for(int i = 0; i <string.size()-1;i++){ 
    string.add(new Text()); 

} 

initialy該ArrayList是空的,所以string.size()== 0 的forlus西港島線不被執行,改變

public void addText(){ 
    string.add(new Text()) 
} 

或甚至更好

public void addText(Text t){ 
    string.add(t) 
} 

那方式你可以添加用不同的構造函數創建的文本對象

0

問題它是這種方法。

public void addText(){ 
     for(int i = 0; i <string.size()-1;i++){ 
      string.add(new Text()); 

     } 
    } 

這沒有添加任何東西。因爲string.size()是0。

可能是你應該將其更改爲

public void addText(int size){ 
    for(int i = 0; i <size-1;i++){ 
     string.add(new Text()); 

    } 
} 

PS:new Arraylist<Text>(5)實際創建初始容量 = 5(不是大小)的空單。看到它here

0

new ArrayList<Text>(5); 

並不意味着你有5個元素的數組。這意味着這只是用於存儲元素的內部數組的初始容量。由於這是你的初始化代碼:

public void addText(){ 
    for(int i = 0; i <string.size()-1;i++){ 
     string.add(new Text()); 

    } 
} 

面孔列表中沒有的元素與string.size() = 0

使用這個代替(如果你喜歡加5元):

public void addText(){ 
    for(int i = 0; i < 5;i++){ 
     string.add(new Text()); 

    } 
} 

有添加更多元素是沒有問題的(即使初始容量僅爲'5')。 From docu「當元素被添加到ArrayList時,其容量會自動增長。」

+0

非常感謝你:) 我會upvote你的文章,但我沒有代表。 – Anon84858789

+0

感謝您的好意。 – flyer

0

嗯,爲了說明你在Text中的方法需要參數,所以它知道如何在'a'中輸入參數,如果你的參數是可變的,那麼你需要使用'this'。以便編譯器知道這兩者是不同的。

公共類文本{

private String a; 

public void printA(String a) { 
    this.a = "a"; 
    System.out.print(a); 
} 

}

相關問題