在收藏之间进行切换值得吗?

时间:2019-02-06 16:33:18

标签: java collections

Java为我们提供了Collections,在某些情况下,每个选项都是最佳选择。 但是,将以下任务组合在一起将是一个好的解决方案:

  1. 快速遍历列表中的每个元素(顺序无关紧要)
  2. 检查列表中是否包含某些元素

一些被认为可能可能可能不是好的选择:

  • 例如,可以首先使用LinkedList,然后 然后将其转换为HashSet 事先未知(如果不存在重复项的话)
  • 为两个任务中的一个选择一个解决方案,并对另一个任务使用相同的实现(如果不值得切换到另一个实现)
  • 也许存在一些实现两者的实现(未能找到一个实现)

是否有一个“最佳”解决方案,如果是,这是什么?

编辑:对于潜在的未来访问者,this page包含许多具有大型O运行时的实现。

2 个答案:

答案 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