0

我正在尝试创建一个非常非常简单的程序。我希望我的班级被调用Text来简单地打印出一个字符串,特别是一个字母。然后在我的第二个名为 Window 的类中,我想创建该类的 ArrayList,遍历列表并调用我的 Text 类的方法来打印出字符串。但它不打印任何东西。

我究竟做错了什么?

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

}
4

6 回答 6

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

}

最初 arraylist 是空的,所以 string.size() == 0 forlus 不会被执行,改为

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

甚至更好

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

这样您就可以添加使用不同构造函数创建的文本对象

于 2013-07-23T19:59:09.917 回答
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')。来自文档“随着元素被添加到 ArrayList,它的容量会自动增长。”

于 2013-07-23T20:06:50.917 回答
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对象的数据结构。size() 返回 ArrayList 内的对象数量而不是容量

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

    }
}

for 循环的表达式不会计算为真,因此您永远不会将单个对象添加到循环中,这就是为什么如果您在其中添加 print 语句 iterate 会打印 -1

于 2013-07-23T19:57:20.740 回答
0

好吧,对于声明者来说,您在 Text 中的方法需要参数,因此它知道接受“a”,如果您的参数中的变量将是“a”,那么您也需要使用“this”。以便编译器知道两者是不同的。

公共类文本{

private String a;

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

}

于 2013-07-24T01:37:06.067 回答
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(不是大小)的空列表。看这里

于 2013-07-23T19:59:15.213 回答
-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。这只不过是一个打字快捷方式,但它提高了LinkedLists 的效率。

于 2013-07-23T19:57:38.367 回答