我有一个使用java的33000个元素的排序数组列表,如何只列出以子字符串开头的元素。
例如: 我有一个字符串“空气”。所以我需要以“空气”(“飞机”,“空军”,“航空公司”等)开头的每一个字。
有没有办法在没有逐个迭代的情况下做到这一点?
答案 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)的情况下实现这一点。