ArrayList,对象覆盖

ArrayList,对象覆盖

问题描述:

我想用用户对象做一个数组列表,但是当试图向列表中添加一个新对象时,它似乎只能部分工作。ArrayList,对象覆盖

第1期:当已经添加了对象后,做了.size()名单上,并通过该列表包含此对象的System.out.println证实,它仍然不会增加它的大小。假设我有一个包含100个元素的列表,并且在执行.size()时会输出该列表。但是,当试图添加新元素时,.size()仍然会返回100,但.toString()也会返回新对象。

第2期:

使用。新增()我的名单上似乎对象添加到列表中一次,但如果我尝试再次调用该方法来创建另一个用户,它仅覆盖前一个。

这怎么可能?

这里是我的方法 “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

+6

什么是“PersonsArraylist”?上次我检查'ArrayList'没有被破坏([proof](https://ideone.com/uqUFf1)),所以你可以发布一个MCVE? – 2016-03-04 12:11:27

+0

ArrayList PersonsArraylist = new ArrayList(); –

+3

出于清晰的原因,请使用Java编码约定来说明“PersonsArraylist”是一个字段的名称,它应该以小写字符开始,即'personsArraylist'。现在它看起来很像一个班。 – Thomas

您的方法showInterface似乎不正确。

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

看来你执行一个命令后,您要创建一个新的接口,这反过来又创造了新的PersonHandler

您需要至少删除的showInterface方法。

也许这是你之后?

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

工作!非常感谢! :-) –

+0

欢迎您和“欢迎”编程java。你到目前为止做得很好:) – vikingsteve

它可能不直接关系到你目前的问题,但我想与大家分享你的代码的一些意见:

  • PersonHandler领域PersonDataPersonsArray似乎在只使用构造函数,所以他们应该是方法局部变量。
  • 你封装了PersonsArraylist相当不错,但也通过getPersons()(这可能会错过返回类型的泛型)使它可用于外部世界。这样,外面的人可能会混淆可能是问题原因的列表。
  • sortPersons()你正在做你自己的排序。如果这不是为了学习目的,我建议使用Collections.sort()
  • 由于vikingsteve已在showInterface()中回答您正在重新创建您不使用的界面。
  • 在通用设计方面,您不应该混用数据处理和UI代码,例如你在处理程序中做了什么(显示对话框等)。
  • deletePerson()deletePersons()您应该重新创建pid,因为删除的所有人的索引将会改变,并且您定义了pid = index(即在getPerson(int pid)中,您直接使用pid访问列表)。
+0

感谢您的帮助!我开始在2月份开始学习Java的计算机科学课,所以我仍然有很多东西需要学习 - 每个建议都可以接受:-) 我一直在尝试Collections,但是我们的老师希望我们手动对它进行排序,正如你所说,学习。 我试图将代码分离为处理和UI,但仍然看起来像一个B *** CH这样做(我有很多东西要学习)。对于deletePerson()和deletePersons(),我只需要调用我的方法resetPersonsId()corect? –

+0

@EmilElkjærNielsen至于你的最后一个问题:我会将该方法移出处理程序并移入UI代码(在您的案例中的'Interface',这是一个令人误解的名称,可以拆分 - 但你会学到最终,特别是与开发实践和经验)。对于4周前开始的人来说,你的代码看起来非常好。 – Thomas

+0

@EmilElkjærNielsen你的评论现在是不同的,所以我的上面是为了回答你删除的问题:) - 至于你对'deletePerson()'等问题:ids不应该改变,因为这往往会打破很多其他代码(实际上一个对象几乎不会改变它的身份)。因此,我可能宁愿重写'getPerson(int id)'来查找具有该id的人,而不是将其用作索引(您可以使用map id-> Person)。 – Thomas