2016-09-18 25 views
0

(請注意,這是一個初學者問題)從LIFO命令列表中獲取對象? (後進先出)(初學者)

我有兩個類; MailItemMailServer。我有一個測試類,在那裏我發送和發送MailItem到我的MailServer。我向一個特定用戶發送MailItems,我希望以LIFO順序(後進先出)檢索這些郵件,因此發送的最新郵件必須是我收到的第一個郵件。

這是我的課程。

的MailItem類:

public class MailItem 
{ 
    private String from; 
    private String to; 
    private String message; 
    private String subject; 

    public MailItem(String from, String to, String message, String subject) 
    { 
     this.from = from; 
     this.to = to; 
     this.message = message; 
     this.subject = subject; 
    } 

    public String getFrom() 
    { 
     return from; 
    } 

    public String getTo() 
    { 
     return to; 
    } 

    public String getSubject(){ 
     return subject; 
    } 

    public String getMessage() 
    { 
     return message; 
    } 

    public void print() 
    { 
     System.out.println("From: " + from); 
     System.out.println("To: " + to); 
     System.out.println("Message: " + message); 
     System.out.println("Subject: " + subject); 
    } 
} 

郵件服務器類:

public class MailServer 
{ 
    private List<MailItem> items; 
    private HashMap<String, List<MailItem>> hashmap; 

    public int howManyMessages(){ 
     return items.size(); 
    } 

    public int howManyUsers(){ 
     return hashmap.size(); 
    } 

    public MailServer() 
    { 
     items = new LinkedList<MailItem>(); 
     hashmap = new HashMap<String, List<MailItem>>(); 
    } 

    public int howManyMailItems(String who) 
    { 
     int count = 0; 
     for(MailItem item : items) { 
      if(item.getTo().equals(who)) { 
       count++; 
      } 
     } 
     return count; 
    } 

    public MailItem getNextMailItem(String who) 
    { 
     Iterator<MailItem> it = items.iterator(); 
     while(it.hasNext()) { 
      MailItem item = it.next(); 
      if(item.getTo().equals(who)) { 
       it.remove(); 
       return item; 
      } 
     } 
     return null; 
    } 

    public void post(MailItem item) 
    { 
     if(!isEmpty(item)){ 
      items.add(item); 
     } 
    } 

    private boolean isEmpty(MailItem mail){ 
     if(mail.getFrom() == "" || mail.getTo() == ""){ 
      return true; 
     } 
     return false; 
    } 

    public int createMailbox(String user){ 
     if(hashmap.containsKey(user)){ 
      return 0; 
     } 
     List<MailItem> mil = new ArrayList<MailItem>(); 
     hashmap.put(user, mil); 
     return 1; 
    } 

    public int createMailbox(String[] users){ 
     int createdBoxes = 0; 
     for(String user: users){ 
      int created = createMailbox(user); 
      if(created == 1){ 
       createdBoxes++; 
      } 
     } 
     return createdBoxes; 
    } 

    private List<MailItem> getMailbox(String who){ 
     if(hashmap.containsKey(who)){ 
      List<MailItem> ls = hashmap.get(who); 
      return ls; 
     }else{ 
      return null; 
     } 
    } 
} 

下面是我的測試樣子:

@Test 
    public void testReceiveOrder(){ 
     mailServer.post(mess1User1to2); 
     mailServer.post(mess2User1to2); 
     assertEquals(mess2User1to2,mailServer.getNextMailItem("user2")); 
    } 

當我運行這個測試時,我以FIFO(先進先出)方式檢索這些電子郵件。而不是檢索郵件mess2User1to2,我得到mess1User1to2。我嘗試使用LinkedList在LIFO中檢索它們,但它不適用於我。我做錯了什麼?

回答

1

您的post方法將項目添加到列表的末尾,並且您的getNextMailItem方法開始搜索列表前面的項目。因此你得到FIFO(=隊列)行爲。

要改變這種要麼開始在列表的末尾搜索:

public MailItem getNextMailItem(String who) { 
    ListIterator<MailItem> it = items.listIterator(items.size()); 
    while(it.hasPrevious()) { 
     MailItem item = it.previous(); 
     if(item.getTo().equals(who)) { 
      it.remove(); 
      return item; 
     } 
    } 
    return null; 
} 

或者,也可以代替將商品加入列表的前面,但我還沒有檢查,如果這打破任何其他方法:

private LinkedList<MailItem> items; 

public void post(MailItem item) { 
    if(!isEmpty(item)){ 
     items.addFirst(item); 
    } 
} 
+0

謝謝,我用了第二部分,因爲它沒有打破其他方法。 –