Я не понимаю, зачем вам нужен массив хэш-наборов. Вот что я предлагаю:
Set<String> dictionary = new HashSet<String>();
dictionary.add("One");
dictionary.add("Two");
dictionary.add("Three");
dictionary.add("Four");
А вот как бы я это использовал. Примечание: не читайте ниже, если только вы не хотите получить реальный ответ на проблему с ключевыми словами. Это может уменьшить, сколько обучения вы получаете. Так что читайте его, только если у вас все в порядке с испорченным.
List<String> split(String sentence) {
List<String> words = new LinkedList<String>();
String word = ""; // StringBuilder actually is not orders faster in
// this case or I would advocate using it...
for(int i = 0; i < sentence.length(); i++) {
word += sentence.charAt(i); // creates a new String anyway, so StringBuilder
// is far less powerful
if(dictionary.contains(word) {
words.add(word);
word = "";
}
}
return words;
}
Некоторые проблемы:
Давайте предположим, что ваши предложения и слова написаны строчными буквами, чтобы избежать чувствительности к регистру.
Давайте также предположим, что ваш словарь содержит все распространенные английские слова.
dictionary.add("this");
dictionary.add("is");
dictionary.add("a");
dictionary.add("test");
И запустите «thisisatest», и он будет правильно разделен.
Теперь, имейте в виду, есть и другие слова.
dictionary.add("i");
dictionary.add("sat");
dictionary.add("est");
Это все действительные слова. Запуск его даст вам
"this" "i" "sat" "est"
Фактически, по этой логике, КАЖДОЕ слово, начинающееся с i
или a
, в конечном итоге будет пропущено. И это плохо. Специально для таких слов, как "apple"
Вы получите a
в качестве первого слова, затем продолжите поиск "pple"
и слов, начинающихся с "pple"
. Это вызовет много проблем!
Даже если вы сможете обойти эту проблему, вы столкнетесь с проблемами, где слова всегда действительны.
Рассмотрим "уход за деревьями". Это «дерево» «пугать» или «деревья» «заботиться». Вы не можете провести различие - когда-либо!
Так что проблема, которую вы выбрали, это, конечно, придурок!