首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将信息存储在数组中,该列表是hashmap中的值。

将信息存储在数组中,该列表是hashmap中的值。
EN

Stack Overflow用户
提问于 2014-03-11 03:29:32
回答 1查看 246关注 0票数 0
代码语言:javascript
复制
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Iterator;
import java.util.Map;
import java.util.AbstractMap;

/**
 * A simple model of a mail server. The server is able to receive
 * mail items for storage, and deliver them to clients on demand.
 */
 public class MailServer
 {
    // Storage for the arbitrary number of mail items to be stored
    // on the server.
    private HashMap<String,ArrayList<MailItem>> mailMap;

    /**
     * Constructor
     */
    public MailServer()
    {
        mailMap = new HashMap<String,ArrayList<MailItem>>();
    }

    /**
     * Return how many mail items are waiting for a user.
     */
    public int howManyMailItems(String who)
    {
        int count = 0;
        for(ArrayList<MailItem> array : mailMap.values()) {
            for (MailItem item : array) {
                if (item.getTo().equals(who)) {
                    count++;
                }
            }
        }
        return count;
    }

    //  public int howManyMailItems(String who) 
    //  {    
    //      return mailMap.get(who).size(); 
    //  }

    /**
     * Return the next mail item for a user or null if there
     * are none.
     */
    public MailItem getNextMailItems(String who, int howMany)
    {
        // Access the ArrayList for "who" remove and return the first element
        // Be careful what if "who" doesn't have an entry in the mailMap
        // Or what if "who" doesn't have any mail?
        Iterator<Map.Entry<String, ArrayList<MailItem>>> it = 
        mailMap.entrySet().iterator();
        while(it.hasNext()) {
            Map.Entry<String, ArrayList<MailItem>> entry = it.next();
            String key = entry.getKey();
            ArrayList<MailItem> value = entry.getValue();
            if (key.equals(who));
            {
                return value.remove(0);
            }
        }
        return null;
    }

    /**
     * Add the given mail item to the message list.
     */
    public void post(String who)
    {
        if (mailMap.containsKey(who)) {
            Map.put(who, Map.get(who) + 1);
        }

    }
}

以上代码用于基本邮件服务器。我试图让它将一个MailItem(字符串收件人、字符串主题、字符串消息)存储在一个HashMap中,其中包含一个字符串键和一个ArrayList (of MailItems)值。

我遇到麻烦的是post()方法。我不知道如何使它接受消息的对象参数,并将其存储在相应的ArrayList中。

我还遇到了getNextMailItems()方法的问题。我不知道如何使它从收件人的ArrayList返回多个项目。我所能知道的就是添加一个参数,指定返回多少个MailItems。

我对java非常缺乏经验,而且还在学习。请帮帮忙。谢谢你们所有人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 03:53:08

既然您正在学习Java,请允许我指出以下几点:

  • 请尝试番石榴MultiMap,而不是更丑的: HashMap mailMap; 另外,尝试使用接口而不是类,也就是说,Map<String,List<MailItem>会更好,因为它没有将您与特定的实现联系在一起。
  • 这不是最理想的,我怀疑这是错误的: int计数= 0;for(ArrayList数组: mailMap.values()) { for (MailItem item :MailItem){ if (item.getTo().equals(who)) { count++;}} 您应该在地图上调用get(who),如果您得到一个非空列表,您将得到一个用于whoMailItem的列表。然后打电话给List.size()会给你你需要的计数(我怀疑)。
  • 关于这段代码的两个注释: Iterator> it = mailMap.entrySet().iterator();while(it.hasNext()) { Map.Entry entry = it.next();String key = entry.getKey();ArrayList值= entry.getValue();if (key.equals(who));//分号在这里表示如果条件为真,则不做任何{返回value.remove(0);//此块总是执行}}返回null; 如果If中的条件为true,则不会因为分号而执行任何操作,而代码块中的代码将始终在第一次时间执行。这就是说,您再次获得了密钥,因此不需要遍历整个映射(参见前面的要点)。但是,如果您想迭代一个映射,请使用更紧凑的成语: 对于(Map.Entry e: mailMap.entrySet()){ //使用键和值e.getKey(),e.getValue() }
  • 最后,这个区块令人费解: 如果(mailMap.containsKey(who)) { Map.put(who,Map.get(who) + 1);} 你想做什么?Map是接口的名称,没有静态方法putget,所以甚至不会编译。如果您试图为键mailMap添加一个元素,那么您可能想要类似于(列表映射的典型成语,请参见番石榴以获得更好的who ): ArrayList l= mailMap.get(who);if(l == null){ //这段超冗长的代码将简化为:番石榴MultiMap l=新ArrayList();mailMap.put(who,l);}l.add(创建新MailItem */的/*代码);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22315886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档