【发布时间】:2021-02-04 03:00:03
【问题描述】:
我有一个函数可以让我找到一个不完整元素与集合中至少一个元素之间的匹配项。 22.2.X.13 是一个不完整元素的示例,其中有一个项目(用 X 定义)可以采用任何值。
此函数的目标是在一组元素中找到至少一个元素,其中第一个位置有 22 个,第二个位置有 2 个,第四个位置有 13 个。
例如,如果我们考虑集合:
{
20.8.31.13,
32.3.29.13,
24.2.12.13,
19.2.37.13,
22.2.22.13,
27.17.22.13,
26.22.32.13,
22.3.22.13,
20.19.12.13,
17.4.37.13,
31.8.34.13
}
函数的输出返回 True,因为有元素 22.2.22.13 对应于 22.2.X.13。
我的函数将每对元素(如字符串)和每个元素项作为整数进行比较:
public boolean containsElement(String element) {
StringTokenizer strow = null, st = null;
boolean check = true;
String nextrow = "", next = "";
for(String row : setOfElements) {
strow = new StringTokenizer(row, ".");
st = new StringTokenizer(element, ".");
check = true;
while(st.hasMoreTokens()) {
next = st.nextToken();
if(!strow.hasMoreTokens()) {
break;
}
nextrow = strow.nextToken();
if(next.compareTo("X") != 0) {
int x = Integer.parseInt(next);
int y = Integer.parseInt(nextrow);
if(x != y) {
check = false;
break;
}
}
}
if(check) return true;
}
return false;
但是,这是一项昂贵的操作,尤其是在字符串大小增加的情况下。您能否建议我另一种策略或数据结构来快速执行此操作?
我的解决方案与字符串密切相关。但是,我们可以考虑其他类型的元素(例如数组、列表、树节点等)
感谢大家的回答。几乎所有的功能我都试过了,板凳:
myFunction: 0ms
hasMatch: 2ms
Stream API: 5ms
isIPMatch; 2ms
我认为正则表达式的主要问题是创建模式和匹配字符串的时间。
【问题讨论】:
-
似乎是正则表达式的完美应用。
-
将模板中的每个
X替换为\d+,然后使用正则表达式查找匹配的条目。然而,虽然这更简单(并且可能更快一点),但它并没有真正降低问题的复杂性。相反,您可能会考虑使用嵌套 Map 来存储条目,例如{22: {2: {22: {...}}, 3: {...}}, ...} -
@tobias_k 感谢您的回答。使用地图的问题是“跳过”匹配“X”的元素。
-
时间差异太接近了,无法考虑一种方法比其他方法好得多 - 噪声很容易解释两次运行之间的几毫秒差异。再匹配几百万个 IP 会产生更准确的结果。
标签: java string data-structures string-matching