迭代arraylist并通过分组值发送电子邮件

时间:2018-11-21 06:01:36

标签: java arrays loops for-loop java-8

我有一个如下的ArrayList

ArrayList<String> fList = new ArrayList<>();
    fList.add("100510-0001");
    fList.add("100510-0001");
    fList.add("100513-0004");
    fList.add("100510-0002");
    fList.add("100510-0001");
    fList.add("100513-0005");
    fList.add("100513-0006");
    fList.add("100518-0006");
    fList.add("100599-0001");
    fList.add("100593-0009");

我需要根据列表值的前6个字符发送电子邮件。

示例:  我在列表中重复了100510 4次,因此我需要在同一封电子邮件中发送所有4条记录,例如下面的硬编码之一。

我有100513 3次,我可以有n个列表,但是我需要进行递归/迭代,并发送具有相同记录的电子邮件,即在单独的电子邮件中发送100510,在单独的电子邮件中发送100513,等等...

有帮助吗?

ArrayList<String> subList = new ArrayList<>();
    for (int i = 0; i < fList.size(); i++) {
       String subString =  fList.get(0).split("-")[0];
        if(fList.get(i) == "100510"){
            subList.add(fList.get(i));
            createEmail(subList);
        }
        if(fList.get(i) == "100513"){
            subList.add(fList.get(i));
            createEmail(subList);
        }
    }

2 个答案:

答案 0 :(得分:2)

如果您所需要的只是每个“前缀”发送一封电子邮件,那么您所要做的就是分组:

Map<String, List<String>> distinctMap = fList.stream()
            .collect(Collectors.groupingBy(s -> s.split("-")[0]));

distinctMap.forEach((str1, list) -> {
    System.out.println("Sending e-mail for prefix " + str1);
    createEmail(list);
});

您当然可以使用for循环来做到这一点,但是您应该只在所有迭代之后发送电子邮件:

Map<String, List<String>> emailsByPrefix = new HashMap<>();

for (int i = 0; i < fList.size(); i++) {

    String subString = fList.get(i).split("-")[0];

    emailsByPrefix.merge(subString, Arrays.asList(fList.get(i)), (list1, list2) -> {
        List<String> merged = new ArrayList<>();
        merged.addAll(list1);
        merged.addAll(list2);

        return merged;
    });
}

for (Entry<String, List<String>> emailEntry : emailsByPrefix.entrySet()) {
    System.out.println("Sending e-mail for prefix " + emailEntry.getKey());
    createEmail(emailEntry.getValue());
}

答案 1 :(得分:-1)

您可以对原始列表进行排序,收集subList直到第一部分更改,然后在第一部分每次更改时发送subList。

Collections.sort(fList);
String lastPart1 = null;
List<String> subList = null;
for (int i = 0; i < fList.size(); i++) {
   String strPart1 =  fList.get( i ).split("-")[0];
   String strPart2 =  fList.get( i ).split("-")[1];
    if( !strPart1.equals(lastPart1) ){
         if(subList!=null){ //Send the last collected subList
             createEmail( lastPart1, subList );
         }
         subList = new ArrayList<>();
         subList.add (strPart2);
         lastPart1 = strPart1;

    }else{
         subList.add (strPart2);
    }
}