2016-03-04 199 views
0

我想用用戶對象做一個數組列表,但是當試圖向列表中添加一個新對象時,它似乎只能部分工作。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

回答

2

您的方法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

1

它可能不直接關係到你目前的問題,但我想與大家分享你的代碼的一些意見:

  • 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