使用startsWith快速比较字符串

时间:2015-11-10 17:38:52

标签: java

我有以下代码:

rename

由于数组名称可能很长,我想知道从性能的角度来看编写此代码的最佳方法是什么。以这种方式,循环是O(N)。是否有任何java数据结构可以更快地完成同样的事情?

2 个答案:

答案 0 :(得分:1)

答案 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已排序,因此具有相同前缀的所有条目将彼此相邻。这就是为什么你可以线性地走列表直到第一次不匹配,并在那时停止。

相关问题