2016-12-28 4 views
0

У меня есть задача, чтобы удалить любой набор из коллекции, wholy включенной в какой-либо другой набор:Бесконечный цикл на наборах складных

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

КОСМИЧЕСКОГО петля идет бесконечно, в то время как здравый смысл подсказывает мне, что это невозможно в любые обстоятельства. Это происходит потому, что removeAll метод ничего не удаляет из наборов.

Эта загадка сводит меня с ума. Пожалуйста, помогите решить.

Похожие проблемы: Why won't it remove from the set?

+0

Вы сделали пошаговую отладку? Какой шаг для вас не имеет смысла? – user1803551

+0

@ user1803551 Пожалуйста, см. Ответ. Contol-поток в порядке, но «сломан». –

ответ

1

Это может быть проблемой разрешения.

Если вы переопределили это, было бы хорошо видеть ваш метод «removeAll», так или иначе. Вы пытаетесь удалить папки, не так ли?

Если вы не можете решить эту проблему, у меня есть рабочий код, который рекурсивно удаляет папки и файлы внутри него.

Here - образец.

Если вы не удаляете папки, а это просто отладка String, сообщите нам, какой из этих шагов вообще не работает.

+0

Спасибо за предложение, но это всего лишь набор строк. –

+0

Рад, что вы решили проблему :) –

0

Решенный!

Это проблема с хешем. Наборы, добавленные к наборам, были изменены после добавления. Это сделало их невидимыми для removeAll метод, который полагается на hash для поиска элементов.

Довольно загадка, тем не менее.