使我当前的三元搜索树难以支持不区分大小写的搜索的关键因素之一是,我的底层数据结构是一对一映射。请看下面的测试代码:
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) 一个三元搜索树,为映射提供大写键。
(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”将作为map的键,将name0插入到数组列表中。
(3) name1.toString() 将转换为大写(“ABC”)。它将被插入到 TernarySearchTree 中。 S1 将是 TernarySearchTree 的键和值。
(4) “ABC”将作为map的键,将name1插入到数组列表中。
当我尝试
engine.searchAll("a");
(1) TernarySearchTree 将返回“ABC”。
(2)“ABC”将用作访问地图的密钥。 Map 将返回一个数组列表,其中包含 name0 和 name1。
这个解决方案有效。示例代码可以参考新 TSTSearchEngine 的示例代码 http://jstock.cvs.sourceforge.net/viewvc/jstock/jstock/src/org/yccheok/jstock/engine/TSTSearchEngine.java?view=markup
然而,这可能不是一个有效的解决方案,因为它需要两次搜索。我发现有一个C++实现不区分大小写的三元搜索树的C++实现 http://www.abc.se/~re/code/tst/tst_docs/tst_usage.html#usage_custom_comp。因此,C++ 代码有机会移植到 Java。