集折叠无限循环

时间:2016-12-28 11:25:23

标签: java set infinite-loop

我有一项任务是从集合中移除任何集合,该集合包含在其他集合中:

private static Set<Set<String>> foldSets(Set<Set<String>> sets) {
    OUTER:
    while (true) {
        for (Set<String> s1 : sets) {
            Set<Set<String>> toRemove = new HashSet<>();
            for (Set<String> s2 : sets) {
                if (s1.size() > s2.size() && s1.containsAll(s2)) {
                    toRemove.add(s2);
                }
            }
            if (!toRemove.isEmpty()) {
                sets.removeAll(toRemove);
                continue OUTER;
            }
        }
        return sets;
    }
}

OUTER 循环变得无限,而常识告诉我在任何情况下都不可能。这是因为 removeAll 方法不会从集合中删除任何内容。

这个谜语让我发疯。请帮助解决。

类似问题:Why won't it remove from the set?

2 个答案:

答案 0 :(得分:1)

这可能是一个许可问题。

如果你覆盖了它,那么无论如何都会看到你的“removeAll”方法。您正试图删除文件夹,对吗?

如果你无法解决它,我有一个工作代码,以递归方式删除其中的文件夹和文件。

Here就是样本。

如果你没有删除文件夹,它只是一个字符串的东西调试它并告诉我们哪一步根本不起作用。

答案 1 :(得分:0)

<强>解决!

这是一个哈希问题。添加后,添加到的集已被修改。这使得它们对 removeAll 方法不可见,它依赖于 hash 来查找项目。

尽管如此,还是一个谜语。