如何查找arraylist是否包含一个元素并将结果计数添加到Java中的HashMap?

时间:2016-05-26 21:05:26

标签: java arraylist hashmap

我有一个workStatuses列表。每个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来计算每个名称都有的workStatus数量。所以我必须

  1. 通过workStatuses迭代。
  2. 对于每个workStatus,找到名称。
  3. 检查我的nameList中是否存在该名称。
  4. 如果是,那么增加 该名称的Workstatus数量,并将其计入HashMap。
  5. 我做了什么:

    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;
    

    如果我以正确的方式做到这一点,有人可以建议我吗?

4 个答案:

答案 0 :(得分:3)

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

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

因此您将拥有Map<String, Long>

答案 1 :(得分:1)

你可以这样做:

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中存在的每个名称的计数。

答案 2 :(得分:0)

您可以将其更改为:

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

您无法直接从列表检查字符串,而您在HM中输入的应该是 ws

答案 3 :(得分:0)

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);
    }
}