我在接口中保存了大量数据(确切地说是55个)。加在一起,它们在字符串数组中包含近170000个字符串。
我想要做的是将输入元素与给定接口中的字符串进行匹配,并返回与输入元素的模式匹配的所有元素。
我已经将元素保存在字符串数组中,例如。
String[] array = {"element 1", "element 2".....};
对于每个输入,我必须遍历整个字符串数组,以便在列表中找到所有匹配的元素。
我目前正在这样做:
for(int innerIterator = 0; innerIterator < dictionaryArrayLength; innerIterator++){
if (dictionaryArray[innerIterator].matches(""+input[iterator]+"\\D*")) {
matchedWordList.add(dictionaryArray[innerIterator]);
}
}
因为数组的长度是以千为单位的,所以需要一点时间来回答。
我希望这段代码能运行得更好。我目前正在考虑改变我在字典中使用的数据结构。但是有没有更好的方法来遍历列表并找到所有匹配的元素呢
发布于 2016-02-25 19:11:13
如果您使用的是Java 8,您可以尝试使用新的Stream api:
Pattern inputPatter = Pattern.compile(input[iterator] + "\\D*");
List<String> matchingWords = Arrays.stream(dictionaryArray).parallel()
.filter(word -> inputPatter.matcher(word).matches()).collect(Collectors.toList());
matchedWordList.addAll(matchingWords);
使用第一行(Pattern inputPatter = Pattern.compile(input[iterator] + "\\D*");
)可以避免
在每次循环迭代时创建正则表达式字符串,在每次迭代时创建相对模式对象(参见String.matches
)的源代码
使用Arrays.stream
,您可以从数组创建流。
使用.parallel
,您可以并行化数据流,以便在多个线程之间分配以下操作(对于庞大的数据集,它可以显着提高性能)。
使用.filter(word -> inputPatter.matcher(word).matches())
,您只需选择与您的模式匹配的单词。
使用.collect(Collectors.toList())
,您可以将结果收集到一个列表中。
https://stackoverflow.com/questions/35624466
复制相似问题