Одним из ключевых факторов, которые затрудняют поддержку моего текущего троичного дерева поиска для поиска без учета регистра, является то, что моя основная структура данных - это сопоставление «один к одному». Пожалуйста, посмотрите на следующий тестовый код:
public void testPut() {
System.out.println("put");
Name name0 = new Name("abc");
Name name1 = new Name("abc");
TernarySearchTree<Name> instance = new TernarySearchTree<Name>();
instance.put(name0.toString(), name0);
instance.put(name1.toString(), name1);
assertEquals(2, instance.matchPrefix("a").size()); // fail here. Result is 1
}
Мое текущее краткосрочное решение заключается в том, что я использую TSTSearchEngine, чтобы обернуть все TernarySearchTree. TSTSearchEngine состоит из
(1) TernarySearchTree, предоставляющий ключ UPPER-CASE для сопоставления.
(2) Карта String-to-ArrayList.
Вот что происходит, когда я выступаю:
TSTSearchEngine<Name> engine = TSTSearchEngine<Name>();
engine.put(name0); // name0 is new Name("Abc");
engine.put(name1); // name0 is new Name("aBc");
(1) name0.toString () будет преобразовано в верхний регистр ("ABC"). Он будет вставлен в TernarySearchTree. «ABC» будет и ключом, и значением для TernarySearchTree.
(2) «ABC» будет использовать в качестве ключа для карты, чтобы вставить name0 в список массивов.
(3) name1.toString () будет преобразовано в верхний регистр ("ABC"). Он будет вставлен в TernarySearchTree. S1 будет и ключом, и значением для TernarySearchTree.
(4) «ABC» будет использовать в качестве ключа для карты, чтобы вставить name1 в список массивов.
Когда я пытаюсь
engine.searchAll("a");
(1) TernarySearchTree вернет "ABC".
(2) «ABC» будет использоваться в качестве ключа для доступа к карте. Карта вернет список массивов, который содержит name0 и name1.
Это решение работает. Пример кода можно сослаться на Пример кода для нового TSTSearchEngine
Однако это может быть неэффективным решением, поскольку требует двухпроходного поиска. Я обнаружил, что есть реализация в C ++ C ++ Реализация троичного дерева поиска без учета регистра . Следовательно, существует возможность переноса кода C ++ на Java.