Java为我们提供了Collections,在某些情况下,每个选项都是最佳选择。 但是,将以下任务组合在一起将是一个好的解决方案:
一些被认为可能或可能可能不是好的选择:
LinkedList
,然后
然后将其转换为HashSet
事先未知(如果不存在重复项的话)是否有一个“最佳”解决方案,如果是,这是什么?
编辑:对于潜在的未来访问者,this page包含许多具有大型O运行时的实现。
答案 0 :(得分:2)
HashSet
可以快速迭代并提供有效的查找。
HashSet<Object> set = new HashSet<>();
set.add("Hello");
for (Object obj : set) {
System.out.println(obj);
}
if (set.contains("Hello")) {
System.out.println("Found");
}
答案 1 :(得分:-1)
快速遍历列表中的每个元素(顺序无关紧要)
顺序无关紧要,您应该使用时间复杂度为Collection
的{{1}}实现,因为它们每个都在实现O(n)
,并且如果要迭代每个元素,您都必须至少访问每个元素一次(因此,没有什么比Iterable
更好的了)。当然,实际上,一种实现比另一种实现更适合,因为您经常需要考虑多种因素。
检查列表中是否包含某些元素
这通常是O(n)
的用例,Set
操作的时间复杂度要好得多。这里要注意的一件事是,contains
在元素上进行迭代时没有预定义的顺序。在实现之间可能会发生变化,并且对此进行假设很有风险。
正在回答您的问题:
从我的角度来看,如果您可以选择自己选择类的数据结构,请针对该用例选择最自然的数据结构。如果您可以想象必须多次致电Set
,那么contains
可能适合您的用例。您还可以使用Set
,并且每次需要调用List
(多次)时,都可以使用之前contains
中的所有元素来创建Set
。当然,如果您经常调用此方法,则为每个调用创建List
会昂贵。您可以首先使用Set
。
您的评论指出,您拥有一个玩家世界,并且想要检查某个玩家是否属于某个特定世界对象。由于世界拥有玩家,因此还应该包含某种Set
来存储他们。现在,在这种情况下,我建议使用Collection
,将玩家的共同标识符作为键,并将玩家本身作为值。
Map