我正在尝试创建一个非常非常简单的程序。
我希望我的班级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();
}
}
答案 0 :(得分: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)
}
通过这种方式,您可以添加使用不同构造函数创建的Text对象
答案 1 :(得分:0)
如果将iterate修改为:
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内的对象数而不是capcity
public void addText(){
for(int i = 0; i <string.size()-1;i++){
string.add(new Text());
}
}
for循环的表达式不计算为true,因此你永远不会在循环中添加单个对象,这就是为什么如果在那里添加print语句,iterate将打印-1
答案 2 :(得分: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
答案 3 :(得分: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,它的容量会自动增长。”
答案 4 :(得分:0)
好吧,你需要在Text需要参数中使用你的方法,所以它知道接受'a',如果你的参数中的变量是'a',你需要使用“this”。这样编译器就知道两者是不同的。
公共类文本{
private String a;
public void printA(String a) {
this.a = "a";
System.out.print(a);
}
}
答案 5 :(得分:-2)
你做错了是你正在创建容量为5的ArrayList
,但它还没有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
的效率。