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

标签 java enums

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

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/

相关文章:

java - 通过 javax.print 打印时指定出纸盒/托盘

java - 尝试从 Java 运行 Github CLI 命令 gh auth login --with-token 时出现问题

Java - 私有(private)和包私有(private)枚举构造函数之间的区别

java - 遇到 Java 错误 : class, 接口(interface)或预期的枚举

java - 将概率分配给随机枚举对象

java - 枚举如何管理泛型?

java - Java WS 中的 session 信息保存在哪里

java - 沿着螺旋线移动到中心,笛卡尔坐标在开始时给出

java - 导入语句上的 SonarQube 规则 "common-java:DuplicatedBlocks"

python - 如何使用基于 ctypes 和 ctypes 的枚举正确调用以 "custom enum"作为参数的函数?