我有像Java这样的字符串数组。
new String[] { "A", "AAD", "AC", "B" };
我想搜索类似starts with 'A'
的模式,并在数组中获取匹配的数组中所有项目的结果。我知道这可以通过迭代数组并对每个元素进行模式搜索来完成。
但有没有有效的方法来实现同样的目标?
感谢。
答案 0 :(得分:1)
您可以添加一些索引以节省时间,方法是不进行无法匹配的检查。例如,您可以为"A"
,"B"
,"C"
等创建26个索引列表,其中字符x
的列表包含至少包含一个字符串的所有字符串索引x
。
当要求搜索模式时,您可以检查所有字母并选择具有最少数量的标记的索引,并仅扫描该字母。
该方案可以更复杂,例如为每对或三个字符存储索引列表。根据您需要搜索的字符串数量,加速可能很大。
当然主要的假设是字符串列表是固定的,有许多元素,你需要做很多搜索。
答案 1 :(得分:1)
您可以编写sql或x-path表达式而不是迭代集合 - 可以选择JoSQL或q-Link或jXpath等库。
<强> JoSQL 强>
String[] strs = new String[] { "A", "AAD", "AC", "B" };;
List<String> stringList = Arrays.asList(strs);
String query = "SELECT * FROM java.util.String str where value Like 'A%'";
库实际上以优化的方式迭代您的集合。
答案 2 :(得分:1)
这使用josql从集合中查询
使用此查询&#34; SELECT * FROM java.lang.String where toString $ LIKE&#39; A%&#39;&#34;
示例:
List<String> names=new ArrayList<String>();
String[] n={"Burke", "Connor", "Frank", "Everett", "Albert", "George", "Harris", "David" };
Collections.addAll(names, n);
Query q=new Query();
q.parse("SELECT * FROM java.lang.String where toString $LIKE 'A%'");
List<String> results=(List<String>)q.execute(names).getResults();
for(String name:results) {
System.out.println(name);
}
答案 3 :(得分:0)
为什么不试试Predicates? (来自Google Guava)
这里有关于如何使用谓词的解释: Predicate in Java
但基本上它会在List上创建一种抽象迭代,通过创建一个具有所需条件的谓词,作为一个过滤器,你实际上并没有迭代它,Predicate完成了繁重的工作。
答案 4 :(得分:0)
试试这个。
String [] strarray = new String[] { "A", "AAD", "AC", "B" };
ArrayList<String> resultsList = new ArrayList<String>();
Pattern pattern = Pattern.compile("The pattern U want to search for");
for (String string : strarray) {
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
resultsList.add(string);
}
}