ArrayList被覆盖

时间:2018-12-14 20:47:28

标签: java arrays arraylist

我正在尝试将新的训练添加到我的数组列表中,但是添加训练后,新输入将覆盖数组列表的现有内容。这导致arraylist中只有一项,而不能添加更多而不会覆盖另一项。由于我不太清楚代码中此问题的根源,因此我在这里寻求帮助。

正在上这堂课的火车:

public class RCommand extends RBaseListener {
        Company mycompany = new Company("traincompany");

        @Override 
        public void enterNewtraincommand(RParser.NewtraincommandContext ctx) {
            System.out.println("Now creating new train " + ctx.getText());
            mycompany.addTrainTo(new Train(ctx.getChild(2).toString()));
            System.out.println(mycompany.getTrains().size());
        }
}

在本课程中,应该将火车添加到列表中。

public class Company{

        private String name;
        List<Train>trains = new ArrayList<Train>();

        public void addTrainTo(Train train) {
                trains.add(train);
                for (Train t :trains) {
                        System.out.println(t.getName());
                }
        }
}

3 个答案:

答案 0 :(得分:0)

只需对您的班级公司进行测试,看看是否可行

    public class Test {
        Company company = new Company();

        public static void main(String[] args) {
            Test test = new Test();
            test.start();
        }

    private void start() {

    System.out.println("IT work");
    company.addTrainTo(new Train("One"));
    System.out.println("End first add");
    company.addTrainTo(new Train("two"));
    System.out.println("End second add\n");

    System.out.println("Follow example will not work");
    company = new Company();
    company.addTrainTo(new Train("One"));
    System.out.println("End first add");
    company = new Company(); // <--- create the ERROR
    company.addTrainTo(new Train("two"));
    System.out.println("End second add");
    }
}

假设我们按原样训练:

public class Train {
    private String name;

    public Train(String name) {
        this.name = "Train" + name;
    }

    public String getName() {
        return name;
    }
}

输出为:

IT工作

火车一号

先结束添加

火车一号

训练两个

第二秒添加(正常工作)

以下示例将不起作用

火车一号

先结束添加

训练两个

第二次添加结束<-我们错过了第一趟火车,因为我们重新创建了公司实例

这样就可以了。

因此错误不在此类Company中。

  1. 在添加新火车之前,检查公司的呼叫者是否重新创建了公司类
  2. 检查类火车是否有奇怪的东西(名称或类似内容的静态属性)

答案 1 :(得分:0)

似乎为每次添加都创建了新的“火车”对象。添加后,尝试打印“ trains”对象的地址以确保确定。您可以通过System.out.println(“火车地址为:” +火车)

打印地址

答案 2 :(得分:-1)

您没有将我们所需的所有代码传递给我们,但我认为,应该使用火车清单创建Company构造函数。

类似的东西:

public class Company{

        private String name;
        List<Train>trains;

        public Company(String name, List<Train> trains){
            this.name = name;
            this.trains = trains;
        }

        ...
}

然后在您的RCommand类中使用新的Constructor

    Company mycompany = new Company(new ArrayList<Train> ,"traincompany");

就可以了。您在代码中的错误是每次通过调用new运算符来创建新的火车清单。