【问题标题】:how to find if an arraylist contains an element and add the result count to HashMap in Java?java - 如何查找arraylist是否包含元素并将结果计数添加到Java中的HashMap?
【发布时间】:2016-05-26 21:05:25
【问题描述】:

我有一个工作状态列表。每个 workStatus 都有其名称和时间。我可以在遍历每个 workStatus 时执行 workStatus.getName()

for (workStatus ws: workStatuses) {
    String name = ws.getName();
}

接下来我有一个名为 nameList 的名称列表。

List<String> nameList = new ArrayList<String>();
nameList.add("Completed");
nameList.add("Failed"); 

现在我正在使用 HashMap 来计算每个名称的 workStatuse 数。所以我必须

  1. 遍历工作状态。
  2. 对于每个 workStatus,找到名称。
  3. 检查该名称是否存在于我的名称列表中。
  4. 如果是,则增加 该名称的 Workstatus 数量并将其放在 HashMap 上。

我做了什么:

Integer numberOfWorkStatus =0;
Map<String,Integer> hm = new HashMap<String,Integer>();
for(WorkStatus ws: workStatuses) {
                if (ws.getName()!=null && nameList.contains(ws.getName())) {
                    numberOfWorkStatus++;   
                    hm.put(ws.getName(), numberOfWorkStatus);
                }
}
return hm;

如果我以正确的方式做事,谁能建议我?

【问题讨论】:

  • 您的代码似乎没有“计算每个名称的 workStatuses 数”,例如 totalCount 似乎是为任何名称共享的,还是我误解了?
  • Loris 未共享。每个名称可以有不同数量的 workStatuse。这就是我想要的。我已经更改了变量名称以使其现在提供更多信息。现在有意义吗?
  • 我只是说您的代码正在共享每个名称的计数,所以这是不正确的。看看提出的答案。

标签: java arraylist hashmap


【解决方案1】:

您可以使用流 API,如果我做对了,请执行以下操作:

// List<WorkStatus> workStatuses = ...
workStatuses.stream().collect(
    Collectors.groupingBy(WorkStatus::getName, Collectors.counting()));

因此您将拥有Map&lt;String, Long&gt;

【讨论】:

  • 我认为您需要在收集之前过滤具有空名称的“ws”对象
  • 为了符合OP的要求,您需要过滤名称存在于namelist中的workStatuses。
【解决方案2】:

你可以这样做:

for(Stirng name :nameList)
    hm.put(name, 0);

for(WorkStatus ws: workStatuses) {
    if( hm.get(ws.getName() != null)
        hm.put(ws.getName(), hm.get(ws.getName()) + 1);

}

hm 将包含 workStauses 中存在的每个名称的计数。

【讨论】:

  • 很好的答案,除了第二部分,你说你可以在没有条件的情况下做到这一点,我不认为这是一个选择,因为如果你得到一个名字不在 nameList 中的 workStatus,你会得到一个 NullPointerException。
  • 是的,你是对的 :) 空指针无处不在,我们应该关心它 :)),谢谢
【解决方案3】:

您可以将其更改为:

for (String str:nameList){
  if (str.contains(ws.getName())) {
    totalCount++;   
    hm.put(ws.getName(), totalCount);
 }
}

您不能直接从 list 中检查 String,而您放入 HM 中的应该是 ws

【讨论】:

  • 更改为 ws,这是一个拼写错误。我会通过你的建议并尝试一下。将更新结果。谢谢。
【解决方案4】:
Map<String, Integer> hm = new HashMap<>();
for (WorkStatus ws : workStatuses) {
    if (ws.getName() != null && nameList.contains(ws.getName())) {
        hm.putIfAbsent(ws.getName(), 0);
        hm.put(ws.getName(), hm.get(ws.getName()) + 1);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多