添加新记录时错误更新 ArrayList 记录 [英] Erroneous update of ArrayList records when a new record is added

查看:27
本文介绍了添加新记录时错误更新 ArrayList 记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个任务表并操作其内容.我正在处理一个我不明白的错误,非常感谢您的帮助.我对问题的长度表示赞同,但试图提供尽可能多的细节.

tasksRepository 类将在taskDef 类中构造的记录存储为数组列表.setTask () 和 getTask 方法包含 ArrayList 类的 add() 和 get() 方法.

taskDef 对象的参数是使用本地设置方法创建的.下面是这种方法的一个例子:如果传递的参数与存储的值不同,它将被存储值并且事件将被添加到日志记录中.在任何情况下,都会重新调整成功标志.

public static Boolean setProjectNumber(String projectNumberI){//一切if (projectNumberI != projectNumber){项目编号 = 项目编号 I;logAccumulator = logAccumulator + "; 项目编号 (" + projectNumberI + ")";}返回真;}私有静态void setLog(){//当所有参数都设置好后,更新日志参数并带有时间标签String t = formatterFull.format(GregorianCalendar.getInstance().getTime());log = log + "\n" + t + ":" + logAccumulator;}

tasksTableProcessing 类包含任务操作.以下包含构造函数.它以更简单的形式开始,但在调查期间我改变了它.taskStatus 类是返回字符串的 ENUM.方法 getLog() 只是返回日志字段

public tasksTableProcessing(){//构造函数.使用测试记录创建 tableRepository 对象tasksRepository.clearDb();taskDef task = null;task = new taskDef("P1000", "O1", taskStatus.started(), "1", "false", "false");tasksRepository.addTask(任务);System.out.println("\nLog 0: \n" + tasksRepository.getTask(0).getLog());任务 = 空;task = new taskDef ("P1000", "O1", taskStatus.started(), "2", "false", "true");tasksRepository.addTask(任务);System.out.println("\nLog 1: \n" + tasksRepository.getTask(1).getLog());任务 = 空;task = new taskDef ("P2000", "O2", "closed", "63", "true", "false");tasksRepository.addTask(任务);System.out.println("\nLog 2: \n" + tasksRepository.getTask(2).getLog());任务 = 空;task = new taskDef ("P2000", "O2", "closed", "64", "true", "true");tasksRepository.addTask(任务);System.out.println("\n日志3:\n" + tasksRepository.getTask(3).getLog());}

以下是日志.它表明当引入新记录时,所有旧记录都会更新.

<块引用><块引用>

日志 0:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始)

日志 1:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真)

日志 2:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假)

日志 3:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(已开始);任务(任务 2);任务 ID (2);交付标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假);任务(任务 64);任务 ID (64);交付标志(真)

解决方案

给定方法签名,您将 TaskDefs 的成员存储为静态字段,而不是实例字段.静态字段是类 TaskDef 本身的字段,而不是特定 TaskDef 实例的字段.

阅读关于实例和类成员的 Java 教程.

I am trying to create a table of tasks and manipulate its contents. I am tackling with a bug I don't understand, and be very thankful for help. I applogoze for the length of the question, but trying to bring as much details as possible.

The class tasksRepository stores the records, which are constructed in the class taskDef, as array list. The setTask () and getTask methods contains the add() and get() methods of the ArrayList class.

The taskDef object's parameters are created using local set methods. The following is an example to such method: If the delivered parameter differs from the stored value it will be stored value and the event will be added to the log record. In any case a success flag is retuned.

public static Boolean setProjectNumber(String projectNumberI)
{ // All the 
    if (projectNumberI != projectNumber)
    {
        projectNumber = projectNumberI;
        logAccumulator = logAccumulator + "; project number (" + projectNumberI + ")";
    }
    return true;
}

private static void setLog ()
{ // When all the parameters are set, the log parameter is updated with time tag
    String t = formatterFull.format(GregorianCalendar.getInstance().getTime());
    log = log + "\n" + t + ": " + logAccumulator;       
}

The class tasksTableProcessing contains the tasks manipulation. The following contains the constructor. It was started in a simpler form, but during the investigation I changed it. The class taskStatus is ENUM that returns strings. The method getLog () simply returns the log field

public tasksTableProcessing () 
{ // constructor. Creates the tableRepository object with test records
    tasksRepository.clearDb ();

    taskDef task = null; 
    task = new taskDef ("P1000", "O1", taskStatus.started (), "1", "false", "false");
    tasksRepository.addTask (task);
    System.out.println("\nLog 0: \n" + tasksRepository.getTask(0).getLog());

    task = null;
    task = new taskDef ("P1000", "O1", taskStatus.started(), "2", "false", "true");
    tasksRepository.addTask (task);
    System.out.println("\nLog 1: \n" + tasksRepository.getTask(1).getLog());

    task = null;
    task = new taskDef ("P2000", "O2", "closed", "63", "true", "false");
    tasksRepository.addTask (task);
    System.out.println("\nLog 2: \n" + tasksRepository.getTask(2).getLog());

    task = null;
    task = new taskDef ("P2000", "O2", "closed", "64", "true", "true");
    tasksRepository.addTask (task);
    System.out.println("\nLog 3: \n" + tasksRepository.getTask(3).getLog());
}

The following is the log. It shows that when a new record is introduced, all the old records are updated.

Log 0:

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started)

Log 1:

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true)

Log 2:

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true); project number (P2000); task (Task 63); task ID (63); owner (O2); status (closed); critical path (true); delivery flag (false)

Log 3:

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true); project number (P2000); task (Task 63); task ID (63); owner (O2); status (closed); critical path (true); delivery flag (false)

09/07/2012 10:21: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started); task (Task 2); task ID (2); delivery flag (true); project number (P2000); task (Task 63); task ID (63); owner (O2); status (closed); critical path (true); delivery flag (false); task (Task 64); task ID (64); delivery flag (true)

解决方案

Given the method signatures, you store the members of your TaskDefs as static fields, rather than instance fields. A static field is a field of the class TaskDef itself, and not a field of a specific TaskDef instance.

Read the Java tutorial about instance and class members.

这篇关于添加新记录时错误更新 ArrayList 记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆