Итерирование массива и отправка электронной почты путем группировки значений - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 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 голосов
/ 21 ноября 2018

Если все, что вам нужно, это отправить одно электронное письмо с «префиксом», тогда все, что вам нужно сделать, это группа:

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());
}
0 голосов
/ 21 ноября 2018

Можно отсортировать исходный список, собирать подсписок до тех пор, пока не изменится первая часть, а затем отправлять подсписок при каждом изменении первой части.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...