如何在排序的ArrayList中找到以子字符串开头的元素?

时间:2016-04-10 04:56:25

标签: java search arraylist

我有一个使用java的33000个元素的排序数组列表,如何只列出以子字符串开头的元素。

例如: 我有一个字符串“空气”。所以我需要以“空气”(“飞机”,“空军”,“航空公司”等)开头的每一个字。

有没有办法在没有逐个迭代的情况下做到这一点?

3 个答案:

答案 0 :(得分:1)

因此,如果你有一个排序ArrayList<String> words,你可以这样做:

String prefix = "air";
int start = Collections.binarySearch(words, prefix);  
// index of prefix OR -(insertion point) - 1
if (start < 0)  // prefix is not contained as a whole word
    start = -start - 1;
int end = start;
while (end < words.size() && words.get(end).startsWith(prefix))
    end++;
List<String> prefixWords = words.subList(start, end);

二进制搜索为O(log(N)),切片为O(K),其中K是子列表的长度(&#34; air&#34; - 前缀词的数量)。所以,这应该比在列表上迭代要好得多,至少要在不同的前缀上进行转换(最坏的情况是所有单词都以前缀开头)。

答案 1 :(得分:1)

Stream API怎么样?

List<String> list = Arrays.asList("airplane", "airforce", "airline", "etc.");
List<String> prefixWords = list.stream()
            .filter(word -> word.startsWith("air"))
            .collect(Collectors.toList());

prefixWords.forEach(System.out::println);

答案 2 :(得分:0)

如果你不知道以“air”开头的元素数量,你的搜索将是O(n)的顺序。没有蛮力方法或平衡树搜索,你可以在不到O(n)的情况下实现这一点。