В поисках предложений по оптимизации для преобразования карты в карту - PullRequest
0 голосов
/ 10 мая 2019

Я ищу отзывы о том, есть ли более эффективный подход, чем то, что я делаю в моем коде, показанном внизу.

В основном, учитывая эту карту:

        Set<String> A_Set = new HashSet<>(Arrays.asList("1111", "2222", "5555"));
        Set<String> B_Set = new HashSet<>(Arrays.asList("3333", "4444"));
        Set<String> C_Set = new HashSet<>(Arrays.asList("6666"));
        Set<String> D_Set = new HashSet<>(Arrays.asList("2222", "5555", "6666"));

        Map<String, Set<String>> values = new HashMap<>();
        values.put("A", A_Set);
        values.put("B", B_Set);
        values.put("C", C_Set);
        values.put("D", D_Set);

, который выглядит так:

enter image description here

Как мне создать Map<String, List<Boolean> map такой, чтобы он выглядел так:

enter image description here

Наиболее эффективным способом . У моего реального Map есть тысячи значений на Set, но есть только 4 Sets (A, B, C, D).

Вот мой текущий код. Можете ли вы придумать более эффективный подход?

import java.util.*;

public class MapToMap {

    public static void main(String[] args) {
        Set<String> A_Set = new HashSet<>(Arrays.asList("1111", "2222", "5555"));
        Set<String> B_Set = new HashSet<>(Arrays.asList("3333", "4444"));
        Set<String> C_Set = new HashSet<>(Arrays.asList("6666"));
        Set<String> D_Set = new HashSet<>(Arrays.asList("2222", "5555", "6666"));

        Map<String, Set<String>> values = new HashMap<>();
        values.put("A", A_Set);
        values.put("B", B_Set);
        values.put("C", C_Set);
        values.put("D", D_Set);

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

        for (Map.Entry<String, Set<String>> v : values.entrySet()) {
            for (String val : v.getValue()) {
                if (exists.containsKey(val)) {
                    List<Boolean> list = exists.get(val);
                    list = addValue(v.getKey(), list);
                    exists.put(val, list);
                } else {
                    List<Boolean> newList = new ArrayList<>(Arrays.asList(false, false, false, false));
                    newList = addValue(v.getKey(), newList);
                    exists.put(val, newList);
                }
            }
        }
        for (Map.Entry<String, List<Boolean>> s : exists.entrySet()) {
            System.out.println(s);
        }
    }

    private static List<Boolean> addValue(String key, List<Boolean> listToUse) {
        List<Boolean> newList = new ArrayList<>();
        if (Objects.equals("A", key)) {
            newList.addAll(Arrays.asList(true, listToUse.get(1), listToUse.get(2), listToUse.get(3)));
        } else if (Objects.equals("B", key)) {
            newList.addAll(Arrays.asList(listToUse.get(0), true, listToUse.get(2), listToUse.get(3)));
        } else if (Objects.equals("C", key)) {
            newList.addAll(Arrays.asList(listToUse.get(0), listToUse.get(1), true, listToUse.get(3)));
        } else if (Objects.equals("D", key)) {
            newList.addAll(Arrays.asList(listToUse.get(0), listToUse.get(1), listToUse.get(2), true));
        }
        return newList;
    }
}

1 Ответ

1 голос
/ 10 мая 2019

Вот решение с использованием потоков:

Map<String, List<Boolean>> exists = values.values()
        .stream()
        .flatMap(Set::stream)
        .distinct()
        .collect(Collectors.toMap(v -> v, v -> Stream.of("A", "B", "C", "D")
                .map(k -> values.get(k).contains(v))
                .collect(Collectors.toList())));

Демо Ideone

...