我的字符串如下所示 A.B.C
a1.b1.c1
a1.b1.c2
a1.b2.c3
a2.b1.c1
a2.b2.c2
a3.b3.c3
如果要求a1.*
,它应该从a1
开始返回所有字符串。
如果要求a1.b1
,则应返回从a1.b1
所有输出应按排序方式(词典)
关于数据结构的任何建议,我都在想Suffix Tree
。
答案 0 :(得分:0)
此代码可能会对您有所帮助。
String stringarray[] = {"a1.b1.c1",
"a1.b1.c2",
"a1.b2.c3",
"a2.b1.c1",
"a2.b2.c2",
"a3.b3.c3"};
String startingfrom = "a1.b1";
for(int i = 0; i < stringarray.length;i++) {
if(stringarray[i].startsWith(startingfrom))
System.out.println("string is : " + stringarray[i]);
}
答案 1 :(得分:0)
如果您的字符串集基本上是固定的(不经常更新),那么一个简单的排序列表就可以了。要查找带有前缀的所有字符串,请在该列表上执行二进制搜索,找到第一个字符串。然后从字符串匹配前缀的那一点开始迭代。
就内置Java数据结构而言,我建议使用TreeSet。
SortedSet<String> data = new TreeSet<String>();
Set<String> findMatching(SortedSet<String> data, String prefix) {
String prefix = prefix.replace("*", ""); // remove unnecessary *
String nextPrefix = prefix + '\uffff'; // a string guaranteed to be after anything matching the prefix
// get the subset after the prefix, and then get the subset of that before the prefix
return data.tailSet(prefix).headSet(nextPrefix, false);
}
findMatching(data, "a1.b1.*");
使用nextPrefix
有点难看,因为我假设前缀始终是.
- 分开的部分的序列,并且附加FFFF字符是获得字符串大于的最佳方式任何匹配的前缀。可能有更好的方法来完成这一部分。
答案 2 :(得分:0)
NavigabeeSet可以做这样的事情并且快速:
NavigableSet<String> s = new TreeSet<>();
s.addAll(Arrays.asList("a1.b1.c1", "a1.b1.c2", "a1.b2.c3", "a2.b1.c1"));
System.out.println(s.subSet("a1.", true, "a2", false)); // a1.*
System.out.println(s.tailSet("a1.b1")); // a1.b1
输出
[a1.b1.c1, a1.b1.c2, a1.b2.c3]
[a1.b1.c1, a1.b1.c2, a1.b2.c3, a2.b1.c1]
答案 3 :(得分:0)
我的功能:
class Match
{
public static ArrayList<String> match (String[] data, String regex)
{
ArrayList<String> m = new ArrayList<String>();
for (String d : data)
{
if (d.matches(regex))
{
m.add(d);
}
}
Collections.sort(m);
return m;
}
}
测试:
String data [] =
{"a1.b1.c1",
"a1.b1.c2",
"a1.b2.c3",
"a2.b1.c1",
"a2.b2.c2",
"a3.b3.c3"};
// match using a regular expression
ArrayList<String> matched = match (data, "^a1\.b1.*");
答案 4 :(得分:0)
您可以创建一个3d树(kd-tree的特例)。然后,要搜索a1.b1.*
之类的内容,您可以在a1.b1.c1_min
和a1.b1.c1_max
上进行范围搜索。并对输出进行排序。
这会为您提供O (n ^ (2/3) + r)
进行搜索,O (r log (r))
进行排序,其中n
是所有节点的数量,r
是找到的节点数。
搜索复杂性来自一般kd树的搜索复杂性:O(n ^ (1-1/k) + r)
,在3d树的情况下,k
是3. ^
是强大的。