Mam listę List<File>:
"Hanna Kowalska nie lubi plackow.txt"
"Anna Kowalska też nie lubi plackow.txt"
"Mateusz Kowalski lubi placki.txt"
"placki je tylko Katarzyna Kowalska.txt"
"a robi je Anna Kowalska.txt"
"bla bla Katarzyna Kowalska bla.txt"
itd.
ktorą dzielę na części (List<List<File>>).
W pierwszej części znajdują się:
"Hanna Kowalska nie lubi plackow.txt"
"Anna Kowalska też nie lubi plackow.txt"
"Mateusz Kowalski lubi placki.txt"
itd.
W drugiej są:
"placki je tylko Katarzyna Kowalska.txt"
"a robi je Anna Kowalska.txt"
"bla bla Katarzyna Kowalska bla.txt"
itd.
To tylko przykład, ale wszystkich plików jest ok 100 tys.
Dla każdej części odpalam pojedynczy wątek. Każdy wątek buduje TreeMap<String, HashMap<String, Integer>>.
Pierwszy wątek buduje:
Hanna Kowalska, (Hanna Kowalska nie lubi plackow.txt, 13) gdzie 13 to liczba dopasowanych znaków z imieniem i nazwiskiem.
Anna Kowalska, (Anna Kowalska też nie lubi plackow.txt, 12) gdzie 12 to liczba dopasowanych znaków z imieniem i nazwiskiem.
itd.
W drugim wątku powstaje:
Anna Kowalska, (a robi je Anna Kowalska.txt, 12) gdzie 12 to liczba dopasowanych znaków z imieniem i nazwiskiem.
itd.
Chce polaczyć wszystkie mapy TreeMap<String, HashMap<String, Integer>> do jednej, ale one moga zawierac te same klucze - wiec niektore wartosci muszą zostac pobrane i dołączone. Tutaj akurat są tylko dwie mapy ale w rzeczywistości ma być ich ok 1 tys.
Próbuje używać List<CompletableFuture> i Stream w java 8, ale nie rozumiem jak to połączyć i jak to robić dalej.
Oczywiście nie musi to być robione za pomocą stream, ale innej możliwości nie znalazłem albo nie znam.
private void runThreads(){
List<File> filesLists = Arrays.asList(filesAndFoldersArray);
List<List<File>> filesPartsList = divideArrayIntoChunks(filesLists , 50);
TreeMap<String, HashMap<String, Integer>> namesAndFileNamesMatchingCharactersMap = new TreeMap<String, Map<String, Integer>>();
List<CompletableFuture<TreeMap<String, Map<String, Integer>>>> builderPartsMapFutures = filesArrays.stream()
.map(filesList -> CompletableFuture.supplyAsync(() -> buildNamesAndFileNamesWithMatchingCharactersMapForEachChunk(filesList...), executor) // jak dalej?
}
private TreeMap<String, HashMap<String, Integer>> buildNamesAndFileNamesWithMatchingCharactersMapForEachChunk(...){
...// algorytm poszukiwania imion i nazwisk w nazwach plików, nie może zostać zoptymalizowany dla pojedynczego wątka
}