在我的情况下,给定一个枚举,检查该枚举是否属于特定的枚举列表。
我的解决方案是将我要与给定枚举进行比较的所有枚举放到ArrayList中。所以我可以使用ArrayList的contains(..)方法来执行检查任务。
PokemonEnums givenPokemon = ...;
ArrayList<PokemonEnums> AshPokemonList = ...;
while(doing something){
if(AshPokemonList.contains(givenPokemon){
//do fun stuffs
}
}
在表现方面是否可以接受,还是以其他方式我可以更优雅的方式做到这一点?
P / S:虽然我知道AshPokemonList可能不会包含更多10个,但我可以使用if进行多次检查,但是对我来说它看起来很麻烦。但我不知道在性能方面,它会更好吗?答案 0 :(得分:6)
Java提供了一个名为EnumSet<T>
的特殊容器,该容器针对使用enum
进行了优化:
PokemonEnums givenPokemon = ...;
EnumSet<PokemonEnums> ashPokemonSet = ...;
while(doing something){
if(ashPokemonSet.contains(givenPokemon) {
//do fun stuffs
}
}
这个实现应该比数组列表更好,因为它在内部使用位向量:
枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足以使其成为传统的基于int的“位标志”的高质量,类型安全的替代品。
答案 1 :(得分:3)
不,它不是“可接受的”,因为它具有线性复杂性,因此运行时间取决于列表的长度。
请改用EnumSet
。这个类没有排序,但你可以在恒定时间内检查是否包含枚举,无论集合有多大。
答案 2 :(得分:0)
请使用EnumSet:https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html。这是专门为Enums创建的东西。空间和性能方面,非常好。
从API复制粘贴:
与枚举类型一起使用的专用Set实现。全部 枚举集中的元素必须来自单个枚举类型 创建集时,显式或隐式指定。枚举 集合在内部表示为位向量。这种表示是 非常紧凑和高效。时空的表现 这个课程应该足够好,可以让它作为高品质使用, 类型安全替代传统的基于int的“位标志”。甚至批量 操作(例如containsAll和retainAll)应该非常快速地运行 如果他们的论点也是一个枚举集。