- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个如下所示的枚举:
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/
我是一名优秀的程序员,十分优秀!