搜索字符串列表以java中已排序的ArrayList中的特定字符串开头

时间:2014-01-14 12:02:58

标签: java string search

这里我有一个英文单词列表:(例如)

account

angel

apple

application

black

...

我想搜索以特定String开头的字符串。例如:the result for "ap" should be { apple, application }.

可以通过基于序列搜索的解决方案轻松实现返回一组相应的字符串。但是那里的算法仍然比序列搜索强,但它们只返回一个字符串。那么,从ArrayList返回一组相应的String的理想情况比基于序列搜索的那个更快吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

标准API已经有binary search,允许这样做:

    int index = Collections.binarySearch(list, key);
    if (index < 0) {
        index = -(index + 1);
    }
    List<String> result = new ArrayList<String>();
    while (index < list.size()) {
        String s = list.get(index);
        if (s.startsWith(key)) {
            result.add(s);
        }
        else {
            break;
        }
        index++;
    }

答案 1 :(得分:0)

老实说,简单的二进制搜索可以很快完成:

int startPoint = 0;
int endPoint = list.length()-1;

do {
   int mid = (startPoint+endPoint)/2;
   int cmp = list.get().compareTo(str);
   if (cmp > 0) {
      startPoint = mid;
   } else if (cmp < 0) {
      endPoint = mid;
   } else {
       startPoint = mid;
   }

} while (! list.get(startPoint).startsWith(str) && startPoint<endPoint-1);

现在只需从startPoint向你的Set添加字符串两个方向进行扫描,直到找到不匹配的字符串。