Как отфильтровать набор списка на основе другого набора списка? - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть эти данные:

Set<List<String>> allSafe = new HashSet<>();
Set<List<String>> allErrors = new HashSet<>();

Как я могу отфильтровать элементы всех ошибок на основе allSafe? например, если у меня было:

allErrors = [["h","k"],["hi","ho","ha"]]

allSafe = [["h","k"],["sh","ho","ii","oo"],["h","zzz"]]

тогда ожидаемый результат должно быть: filteredAllSafe = [["sh","ii","oo"],["zzz"]]

Это моя попытка, но она не сработала, как ожидалось: возвращает пустой набор списка:

public static Set<List<String>> filterSafe(
      Set<List< String >> allSafe, Set<List< String >> allErrors) {
    Set<List<String>> filteredSet =
        safePath.stream().filter(s -> s.contains(allErrors)).collect(Collectors.toSet());

    return filteredSet;
  }

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вот решение, использующее потоки, в котором все ошибки объединены в один набор для более простой фильтрации

Set<String> errorSet = allErrors.stream()
                           .flatMap(List::stream)
                           .collect(Collectors.toSet());

Set<List<String>> filteredSet = new HashSet<>();
allSafe.stream().forEach(l -> {
    List<String> filtered = l.stream().filter(e -> !errorSet.contains(e)).collect(Collectors.toList());
    if (!filtered.isEmpty())
        filteredSet.add(filtered);
});
1 голос
/ 30 апреля 2020

Сделайте это следующим образом:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<List<String>> allErrors = Set.of(List.of("h", "k"), List.of("hi", "ho", "ha"));
        Set<List<String>> allSafe = Set.of(List.of("h", "k"), List.of("sh", "ho", "ii", "oo"), List.of("h", "zzz"));
        Set<List<String>> filteredSet = new HashSet<List<String>>();
        boolean found;
        List<String> list;
        for (List<String> safe : allSafe) {
            list = new ArrayList<String>();
            for (String strSafe : safe) {
                found = false;
                for (List<String> error : allErrors) {
                    for (String strError : error) {
                        if (strSafe.equals(strError)) {
                            found = true;
                            break;
                        }
                    }
                    if (found) {
                        break;
                    }
                }
                if (!found) {
                    list.add(strSafe);
                }
            }
            if (!list.isEmpty()) {
                filteredSet.add(list);
            }
        }
        System.out.println(filteredSet);
    }
}

Вывод:

[[sh, ii, oo], [zzz]]
...