首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回ArrayList的大小,该值是HashMap中的值

返回ArrayList的大小,该值是HashMap中的值
EN

Stack Overflow用户
提问于 2014-03-09 19:46:26
回答 4查看 546关注 0票数 0

我正在工作的项目,是一个垃圾邮件过滤器的电子邮件客户端。

代码语言:javascript
复制
public MailServer()
{
    mailMap = new HashMap<String,ArrayList<MailItem>>();
}

我被指示使用HashMap来存储收件人,使用ArrayLists来保存他们的mailItems。下一个方法是计数并返回特定收件人的mailItems。

代码语言:javascript
复制
public int howManyMailItems(String who)
{
    int count = 0;
    for(MailItem item : mailMap) {
        if(item.getTo().equals(who)) {
            count++;
        }
    }
    return count;
}

编辑

我在BlueJ中工作,当我试图编译这个类时,它在第4行突出显示了mailMap,并说

“因为--每一个循环都是不可用的”

代码语言:javascript
复制
 public int howManyMailItems(String who)
{
    int count = 0;
    for(MailItem item : mailMap.keySet()) {
        if(item.getTo().equals(who)) {
            count++;
        }
    }
    return count;
}

当我尝试一个keySet时,它说不兼容类型。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-09 19:55:49

Map不实现Iterable接口。这就是为什么您得到了“for-每一个循环不容易理解”的错误。你可以选择在地图上迭代

  • entrySet() -一个Set<Map.Entry<K,V>> (其中K是关键类型,V是映射的值类型);
  • keySet() -a Set<K>;或
  • values() -a Collection<V>.

一般来说,您可能想做这样的事情:

代码语言:javascript
复制
public int howManyMailItems(String who)
{
    int count = 0;
    for(Map.Entry<String,ArrayList<MailItem>> entry : mailMap.entrySet()) {
        String key = entry.getKey();
        ArrayList<MailItem> array = entry.getValue();
        // process key and array value
    }
    return count;
}

很难确切地知道你所使用的是什么逻辑来计算。如果您只需要数组(并且忽略映射的键),那么您可以使用:

代码语言:javascript
复制
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;
}

一般认为,使用接口而不是具体类型声明泛型参数类型是一种很好的做法。例如,您的地图可以声明:

代码语言:javascript
复制
Map<String, List<MailItem>>

而不是

代码语言:javascript
复制
Map<String, ArrayList<MailItem>>

(您必须相应地修改迭代循环中使用的类型。)您仍然可以将ArrayList的实例放入映射中,但也可以改变主意,并将其他类型的List放入其中。(例如,您可以根据对Collections.unmodifiableList(...)的调用,放置不可修改的列表。)

票数 2
EN

Stack Overflow用户

发布于 2014-03-09 19:49:37

代码语言:javascript
复制
public int howManyMailItems(String who) {
    return mailMap.get(who).size();
}
票数 0
EN

Stack Overflow用户

发布于 2014-03-09 19:50:30

您没有提到任何错误,因此很难知道出了什么问题,但是通常需要迭代通过keySet()获得的Map的密钥集,或者通过values()获得的值。

即,

代码语言:javascript
复制
for(String key : mailMap.keySet()) {
    List<MainItem> itemList = mailMap.get(key);
    count += itemList.size(); // ??? not sure if this is what you want??
    // ... etc..
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22287227

复制
相关文章

相似问题

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