我有以下代码:
rename
由于数组名称可能很长,我想知道从性能的角度来看编写此代码的最佳方法是什么。以这种方式,循环是O(N)。是否有任何java数据结构可以更快地完成同样的事情?
答案 0 :(得分:1)
前缀树怎么样?
参考:
How to create a simple prefix index in Java?
http://www.toptal.com/java/the-trie-a-neglected-data-structure
答案 1 :(得分:1)
您可以订购名称,使用不区分大小写的比较器进行二分查找以找到潜在前缀的插入点,然后遍历数组以捕获具有相同前缀的所有其他单词:
// At preparation time
Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);
...
// At query time
int pos = Arrays.binarySearch(names, query, String.CASE_INSENSITIVE_ORDER);
if (pos < 0) {
pos = -(pos+1);
}
while (pos < names.length) {
if (names[pos].toLowerCase().startsWith(query.toLowerCase())) {
c.addRow(new Object[]{pos, names[pos]});
pos++;
} else {
break;
}
}
Arrays.binarySearch
找到插入点。如果名称匹配,pos
将为非负数;否则,您需要使用此表达式将其转换为有效索引:-(pos+1)
如果query
是正确的前缀,则其插入点将位于具有匹配前缀的第一个名称前面。由于names
已排序,因此具有相同前缀的所有条目将彼此相邻。这就是为什么你可以线性地走列表直到第一次不匹配,并在那时停止。