gpt4 book ai didi

java - 在一组元素中查找复杂元素

转载 作者:行者123 更新时间:2023-12-04 00:53:36 25 4
gpt4 key购买 nike

我有一个函数可以让我在不完整的元素和集合中的至少一个元素之间找到匹配项。不完整元素的一个示例是 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;

但是,这是一个昂贵的操作,尤其是当字符串的大小增加时。你能给我建议另一种策略或数据结构来快速执行此操作吗?

我的解决方案与字符串密切相关。但是,我们可以考虑其他类型的元素(例如数组、列表、树节点等)

感谢大家的回答。几乎所有的功能我都试过了,还有bench:

myFunction: 0ms
hasMatch: 2ms
Stream API: 5ms
isIPMatch; 2ms

我认为正则表达式的主要问题是创建模式和匹配字符串的时间。

最佳答案

您想使用专为此类任务制作的正则表达式。查看demo .

22\.2\.\d+\.13

Java 8 及更高版本

从 Java 8 开始,您可以使用 Stream API 使用 PatternMatcher 类找到至少一个与 Regex 匹配的类:

Set<String> set = ... // the set of Strings (can be any collection)

Pattern pattern = Pattern.compile("22\\.2\\.\\d+\\.13"); // compiled Pattern
boolean matches = set.stream() // Stream<String>
.map(pattern::matcher) // Stream<Matcher>
.anyMatch(Matcher::matches); // true if at least one matches

Java 7 及更低版本

方法等同于 Stream API:一个短路 for-each 循环,如果找到匹配项,则使用 break 语句。

boolean matches = false;

Pattern pattern = Pattern.compile("22\\.2\\.\\d+\\.13");
for (String str: set) {
Matcher matcher = pattern.matcher(str);
if (matcher.matches()) {
matches = true;
break;
}
}

关于java - 在一组元素中查找复杂元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64459450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com