Я строю тезаурус, используя HashMap для хранения синонимов.Java: поиск в ключах HashMap на основе регулярных выражений?
Я пытаюсь выполнить поиск по словам, основанным на регулярном выражении: метод должен принимать строку как параметр и возвращать массив результатов. Вот мой первый удар в нем:
public ArrayList<String> searchDefinition(String regex) {
ArrayList<String> results = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
Set<String> keys = thesaurus.keySet();
Iterator<String> ite = keys.iterator();
while (ite.hasNext()) {
String candidate = ite.next();
Matcher m = p.matcher(candidate);
System.out.println("Attempting to match: " + candidate + " to " + regex);
if (m.matches()) {
System.out.println("it matches");
results.add(candidate);
}
}
if (results.isEmpty()) {
return null;
}
else {
return results;
}
}
Теперь это не работает, как я ожидал бы (или, может быть, я использую регулярные выражения неправильно). Если у меня есть следующие ключи в HashMap:
cat, car, chopper
затем путем вызова searchDefinition("c")
или searchDefinition("c*")
я null
.
- Как я могу сделать эту работу должной?
- Есть ли лучшая структура данных, чем HashMap, чтобы поддерживать , как это требуется тезаурусом? (только любопытство, так как для этого задания нам предлагается использовать карту Java Collection).
- Что-нибудь еще, что я делаю innapropriately в коде выше?
Спасибо, Dan
EDIT: Я исправил пример. Это не работает, даже если я использую правильный случай.
У Клинта есть ответ. Но обратите внимание, что вызов find() с «c *» будет соответствовать _any_ entry - потому что все записи имеют 0 или более c. Будьте осторожны с вашими регулярными выражениями. –
Тем более, что вы передаете регулярное выражение непосредственно в компилятор Pattern. Вы можете легко получить PatternSyntaxException. – Clint
Не вопрос, но не возвращайте значение null для пустого и используйте расширенный цикл for. –