3

我在Java中有一个这样的字符串数组。

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

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

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

谢谢。

4

5 回答 5

1

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

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

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

当然,主要假设是字符串列表是固定的,有很多元素,并且您需要进行多次搜索。

于 2013-06-14T05:46:43.180 回答
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%'";

库实际上以优化的方式迭代您的收藏。

于 2013-06-14T05:51:10.283 回答
1

这使用 josql 从集合中查询

使用此查询“SELECT * FROM java.lang.String where toString $LIKE 'A%'”

例子:

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);
}
于 2013-06-14T07:51:25.960 回答
0

为什么不尝试谓词?(来自谷歌番石榴)

这里已经有关于如何使用谓词的解释: Java中的谓词

但基本上它在列表上创建了一种抽象迭代,通过创建具有所需条件的谓词,充当过滤器,您实际上并没有遍历它,谓词完成了繁重的工作。

于 2013-06-14T06:00:10.643 回答
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);
                }
            }
于 2013-06-14T06:15:01.617 回答