我正在工作的项目,是一个垃圾邮件过滤器的电子邮件客户端。
public MailServer()
{
mailMap = new HashMap<String,ArrayList<MailItem>>();
}我被指示使用HashMap来存储收件人,使用ArrayLists来保存他们的mailItems。下一个方法是计数并返回特定收件人的mailItems。
public int howManyMailItems(String who)
{
int count = 0;
for(MailItem item : mailMap) {
if(item.getTo().equals(who)) {
count++;
}
}
return count;
}编辑
我在BlueJ中工作,当我试图编译这个类时,它在第4行突出显示了mailMap,并说
“因为--每一个循环都是不可用的”
public int howManyMailItems(String who)
{
int count = 0;
for(MailItem item : mailMap.keySet()) {
if(item.getTo().equals(who)) {
count++;
}
}
return count;
}当我尝试一个keySet时,它说不兼容类型。
发布于 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>.一般来说,您可能想做这样的事情:
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;
}很难确切地知道你所使用的是什么逻辑来计算。如果您只需要数组(并且忽略映射的键),那么您可以使用:
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;
}一般认为,使用接口而不是具体类型声明泛型参数类型是一种很好的做法。例如,您的地图可以声明:
Map<String, List<MailItem>>而不是
Map<String, ArrayList<MailItem>>(您必须相应地修改迭代循环中使用的类型。)您仍然可以将ArrayList的实例放入映射中,但也可以改变主意,并将其他类型的List放入其中。(例如,您可以根据对Collections.unmodifiableList(...)的调用,放置不可修改的列表。)
发布于 2014-03-09 19:49:37
public int howManyMailItems(String who) {
return mailMap.get(who).size();
}发布于 2014-03-09 19:50:30
您没有提到任何错误,因此很难知道出了什么问题,但是通常需要迭代通过keySet()获得的Map的密钥集,或者通过values()获得的值。
即,
for(String key : mailMap.keySet()) {
List<MainItem> itemList = mailMap.get(key);
count += itemList.size(); // ??? not sure if this is what you want??
// ... etc..
}https://stackoverflow.com/questions/22287227
复制相似问题