How to filter set of list based on another set of list?



I have this input:

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

How can i filter elements of allErrors based on allSafe? for example if I had:

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

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

then the expected output should be:

filteredAllSafe = [["sh","ii","oo"],["zzz"]]

This is my try but it did not work as expected: It returns empty set of list:

public static Set<List<String>> filterSafe(
        Set<List<String>> allSafe,
        Set<List<String>> allErrors) {

    Set<List<String>> filteredSet = allSafe.stream()
            .filter(s -> s.contains(allErrors))
            .collect(Collectors.toSet());

    return filteredSet;
}

Answer

Do it as follows:

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

Output:

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


Source: stackoverflow