我有包含statusEnum
的对象列表。现在,我想返回属于特定提供状态列表的所有对象。
一个简单的解决方案是在对象列表上循环,然后在statusEnums
提供的列表上循环另一个for循环...但是这会起作用,它会使O(n)^ 2的时间复杂度。有没有办法可以将它减少到O(n)?
我无法更改地图。我能想到的唯一其他解决方案是维护基于statusEnums的另一个映射作为键,但这会大大增加空间复杂度。
修改
以下是我为其他人提出的代码......
public List<MyObjects> getObjectsBasedOnCriteria (List<ObjectStatus> statuses, String secondCriteria){
EnumSet<ObjectStatus> enumSet = EnumSet.copyOf(statuses);
for (Map.Entry<Long, MyObject> objEntry : myObjs.entrySet()){
MyObjects obj = objEntry.getValue();
if (enumSet.contains(obj.getStatus()) && obj.equals(secondCriteria)){
...
}
}
}
答案 0 :(得分:2)
使用Set来保存statusEnums(可能是EnumSet
),并使用set.contains(object.getStatus())
或其他任何内容检查每个实例的状态是否在该集合中。
EnumSet
和HashSet
中的查找是O(1),因此解决方案是线性的(假设每个对象只有一个状态)。 EnumSet.contains
比枚举值HashSet.contains
效率更高;但是,选择与总体时间复杂度无关。
答案 1 :(得分:0)
假设你有一些合理的状态,例如,如果你有一个状态枚举,你可以使用EnumSet来匹配状态或HashMap。
即使您不这样做,时间复杂度为O(n * m)
,其中n
是条目数,m
如果您要查找的状态数。通常,假设您将拥有比您正在检查的状态更多的记录。
由于Java编译方式的限制,可能的枚举值的数量限制为几千,因此这始终是枚举的上限。