在Java String数组中搜索模式

时间:2013-06-14 05:34:50

标签: java arrays pattern-matching

我有像Java这样的字符串数组。

new String[] { "A", "AAD", "AC", "B" };

我想搜索类似starts with 'A'的模式,并在数组中获取匹配的数组中所有项目的结果。我知道这可以通过迭代数组并对每个元素进行模式搜索来完成。

但有没有有效的方法来实现同样的目标?

感谢。

5 个答案:

答案 0 :(得分:1)

您可以添加一些索引以节省时间,方法是不进行无法匹配的检查。例如,您可以为"A""B""C"等创建26个索引列表,其中字符x的列表包含至少包含一个字符串的所有字符串索引x

当要求搜索模式时,您可以检查所有字母并选择具有最少数量的标记的索引,并仅扫描该字母。

该方案可以更复杂,例如为每对或三个字符存储索引列表。根据您需要搜索的字符串数量,加速可能很大。

当然主要的假设是字符串列表是固定的,有许多元素,你需要做很多搜索。

答案 1 :(得分:1)

您可以编写sql或x-path表达式而不是迭代集合 - 可以选择JoSQLq-LinkjXpath等库。

<强> 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);
                }
            }