Проверка, содержит ли 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
метод.