gpt4 book ai didi

java - 检查字符串是否包含在枚举集中,时间复杂度为 O(1)

转载 作者:行者123 更新时间:2023-12-01 19:50:05 25 4
gpt4 key购买 nike

假设我有一个如下所示的枚举:

public enum Utils {
UTIL_1, UTIL_2, ... UTIL_n
}

现在,我有 Set<Utils> myUtils ,其中包含一堆这样的枚举条目。其他一些模块(我对其没有任何控制权)为我提供了一个这样的实用程序名称(例如“UTIL_i ”)作为字符串。我需要检查它是否包含在集合 myUtils 中。有什么办法可以在 O(1) 内执行此操作吗?我明白,我可以将集合更改为一组字符串,然后对其执行 .contains() ,但我想将其保留为最后的手段。

更新:按照答案中的建议,我尝试了一些实验。我创建了一个小代码片段来生成一个包含固定大小的枚举的 java 文件。我尝试使用大小 1000、2500、5000。大小为 10000 的枚举向我显示错误 The code for the static initializer is exceeding the 65535 bytes limit在 Eclipse 中,对此进行了解释 here 。我创建了一个集合 myUtils并将枚举中的所有元素插入该集合。对于每个不同的尺寸 myUtils我执行了一个片段 1000 次,看起来像 myUtils.contains(Utils.valueOf(<elementName>)) 。该代码片段的平均执行时间(以毫秒为单位)如下:

枚举大小=1000

UTIL_1     search duration = 1704ms
UTIL_500 search duration = 2316ms
UTIL_1000 search duration = 1732ms

枚举大小=2500

UTIL_1     search duration = 2326ms
UTIL_1250 search duration = 1886ms
UTIL_2500 search duration = 1860ms

枚举大小=5000

UTIL_1     search duration = 2569ms
UTIL_2500 search duration = 2709ms
UTIL_5000 search duration = 2361ms

它清楚地显示了 Enum.valueOf(String element) 的平均执行时间随着枚举的大小而增加,但我不确定此方法的时间复杂度。

最佳答案

您可以通过 Utils util = Utils.valueOf(String) 将 String 转换为实际的 Utils 成员,然后通过 检查它是否包含在集合中code>myUtils.contains(util) AFAIK 是一个 O(1) 操作。

当然,您应该检查异常,以防您获得的字符串实际上不对应于任何Utils。在您的示例中,它不会,因为它应该像枚举名称一样大写。

public enum Utils {
UTIL_1, UTIL_2, ... UTIL_n
}

//...

String utilName = someOtherModuleRoutine();
try {
if (myUtils.contains(Utils.valueOf(utilName))) {
// found!
} else {
// not found :(
}
} catch (IllegalArgumentException e) {
// utilName is not an actual Utils name
}

关于java - 检查字符串是否包含在枚举集中,时间复杂度为 O(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631114/

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