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



我有一个类似的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);
}
}

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

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

您可以对原始列表进行排序,收集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);
}
}

相关内容

最新更新