Проверка, содержит ли HashSet определенное подмножество

У меня есть кусок кода, который содержит

    Collection<String> tok=Arrays.asList(tokens);
    HashSet<String> lookup=new HashSet<String>();  

       while(!lookup.containsAll(tok)&&max<N)
         {
         }

Используя toString(), я обнаружил, что, хотя HashSet содержит коллекцию, все еще метод содержит метод visibleAll, который возвращает false. Я использую метод удаления в коде, но он никогда не вызывается. Полный код находится здесь на pastebin, который будет более читабельным.

Цель состоит в том, чтобы взять входную строку и другие k строк и найти минимальную подпоследовательность во входной строке, которая содержит все k строк

1) Начните с индекса 0 во входной строке и добавьте первые k строк в HashSet, потому что это минимальная последовательность, которая может содержать k различных токенов

2) После этого возьмите диапазон от min=0 до max=k и продолжайте добавлять строку в позиции max и увеличивать max до тех пор, пока набор не будет содержать все токены

3) Когда все токены найдены, удалите строку в позиции min(изначально 0) и увеличьте min. Если после удаления все токены отсутствуют в HashSet. Установите для false значение false, чтобы шаг 2 повторялся на следующей итерации для интервала, начинающегося с этого значения min.

4) Если max-min меньше предыдущей разницы, новая минимальная подпоследовательность будет min-max

Для ввода как

 This is a test. This is a programming test. This is a programming test in any language.
 k=4
 this
 a
test
programming

Выход

 tokens are  [this, a, test, programming]
Increasing Max [is, test, a, this]  found =false
Increasing Max [is, test, a, this]  found =false
Increasing Max [is, test, a, this]  found =false
Increasing Max [is, programming, test, a, this]  found =false
Increasing Max [is, programming, test, a, this]  found =false
 Increasing Max [is, programming, test, a, this]  found =false
 Increasing Max [is, programming, test, a, this]  found =false
Increasing Max [is, programming, test, a, this]  found =false
Increasing Max [is, programming, test, a, this]  found =false
Increasing Max [is, programming, test, a, this]  found =false
Increasing Max [is, programming, test, a, in, this]  found =false
Increasing Max [is, programming, test, any, a, in, this]  found =false
Increasing Max [is, programming, test, any, a, language, in, this]  found =false

No subsegment found

Выходные данные показывают, что remove никогда не вызывался, по-прежнему containsAll() возвращал false, даже если он содержал все строки, присутствующие в коллекции.

Почему он продолжает возвращать false, хотя remove никогда не вызывается?

Возможно, HashSet не будет работать, даже если две вышеупомянутые проблемы будут решены.

 This is a this test.
 2
 this
 test

Так как this с индексом 3 не будет добавлен к набору. Производимый минимальный интервал будет [0-4] вместо [3-4]. Так есть ли коллекция, которая может содержать повторяющиеся значения и имеет метод containsAll или Will я должен использовать HashMap с индексами строк в качестве ключей?

1 ответ

Глядя на код на pasteBin, кажется, что в цикле, который содержит System.out.println(" Increasing Max "+lookup.toString()+" found ="+found);никогда не звонишь lookup.containsAll(tok)то есть то что он выводит false в каждой итерации цикла found быть ложным раньше.

Некоторые другие моменты:

  • Не звони System.exit в вашем коде. (Ну, если вы не обнаружили действительно серьезное исключение или ошибку, которую вы не можете исправить, чего не произойдет с проблемой, которую вы в настоящее время пытаетесь решить).
  • Использовать for цикл, если вы знаете количество итераций заранее. Если вы этого не сделаете, особенно если завершение цикла зависит от нескольких переменных, while Цикл будет намного более читабельным.
  • Для более короткого решения вашей проблемы (которая может даже поместиться на одном экране), посмотрите на sublist метод.
Другие вопросы по тегам