ArrayList,对象覆盖

时间:2016-03-04 12:06:35

标签: java arraylist

我正在尝试使用用户对象创建一个arraylist,但是当尝试将新对象添加到列表中时,它似乎只是部分工作。

第一期:在添加对象后在列表上执行.size(),并通过system.out.println确认列表中包含此对象时,它仍然没有。增加它的大小。

假设我有一个包含100个元素的列表,并且在执行.size()时会输出该元素。然而,当然后尝试添加新元素时,.size()仍返回100,但.toString()也返回新对象。

第二期:

在我的列表中使用.add()时,它似乎将对象添加到列表中一次,但是如果我再次尝试调用该方法来创建另一个用户,它只会覆盖前一个用户。

怎么可能?

以下是我的方法的代码段" createPerson()":

public void createPerson(){
        int pid = handler.getPersonsCount();
        pid += 1;
        String name = JOptionPane.showInputDialog(null, "What's your name?");
        String mail = JOptionPane.showInputDialog(null, "What's your e-mail?");
        String phone = JOptionPane.showInputDialog(null, "What's your phone nummber?");
        String city = JOptionPane.showInputDialog(null, "Which city are you currently living in?");
        String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

        handler.addPerson(new Person(pid, name, mail, phone, city, dateTime));
        showMsg("The following has been added:" + pid
                + "\nName: " + name
                + "\nMail: " + mail
                + "\nNumber: " + phone
                + "\nCity: " + city
                + "\nDatetime: " + dateTime);
        System.out.println(handler.PersonsArraylist.toString());
        System.out.println("Size: " + handler.getPersonsCount());
});
}

handler.getPersonsCount():

public int getPersonsCount() {
        return PersonsArraylist.size();
    }

handler.addPerson():

public void addPerson(Person person) {
        PersonsArraylist.add(person);
    }

如果需要,我已将其推送到Github,因此您可以浏览整个代码:EENielsen/personseacher_oo

2 个答案:

答案 0 :(得分:2)

您的方法showInterface似乎不正确。

private void showInterface() {
    try {
        Interface test = new Interface();
    } catch (ParseException ex) {
        Logger.getLogger(Interface.class.getName()).log(Level.SEVERE, null, ex);
    }
}

执行命令后,您似乎正在创建一个新界面,该界面又会创建一个新的PersonHandler

您至少需要删除new Interface()方法中的showInterface

也许这就是你追求的目标?

private void showInterface() {
    try {
        createStartMenu();
    } catch (ParseException ex) {
        Logger.getLogger(Interface.class.getName()).log(Level.SEVERE, null, ex);
    }
}

答案 1 :(得分:1)

它可能与您当前的问题没有直接关系,但我想就您的代码分享一些观察结果:

  • PersonHandler中,字段PersonDataPersonsArray似乎只在构造函数中使用,因此它们应该是方法局部变量。
  • 你很好地封装了PersonsArraylist,但是也通过getPersons()将它提供给外面的世界(它看起来错过了返回类型的泛型)。这样,外面的某个人可能会弄乱列表,这可能是导致问题的原因。
  • sortPersons()你自己正在进行排序。如果这不是出于学习目的,我建议改为使用Collections.sort()
  • 由于vikingsteve已在showInterface()中回答,您正在重新创建您不使用的界面。
  • 就一般设计而言,您不应混合数据处理和ui代码,例如:你在处理程序中做了什么(显示对话框等)。
  • deletePerson()deletePersons()中,您应该重新创建pid,因为删除后的所有人的索引都会改变,并且您定义了pid = index(即在getPerson(int pid)中使用了pid直接访问列表)。