我用Java编写代码,但大多数语言都可以。
现在,我有一个这样的实现:
我有一个存储类中对象的数组。数组的长度为10,000。
这是我正在进行的一个小项目。从本质上讲,随着时间的推移,数组中的任何位置都可能未使用或者其中包含对象。可以随时创建或销毁对象。
我想弄清楚的是存储和召回它们的最佳方式,以最大限度地减少两个步骤的时间:
创建对象。在大量实例靠近前方时,循环通过阵列直到找到打开的插槽可能会很慢。
绘制对象。我必须不断循环遍历数组,并根据实例的存在,检索并显示有关它的信息。
我当前的系统使用对象列表以及布尔列表。在创建一个对象时,我只是循环直到数组中的第一个空位,然后填充它,然后绘制,我只是重复整个过程。
当然,它不足以使项目无法实现,但我仍然想知道最有效的方法。
答案 0 :(得分:3)
最好的方法是不要这样做。使用其中一个Java collections。如果您不打算经常添加或删除内容,可以使用ArrayList
。如果是,请使用LinkedList
。如果你想保持到特定索引的映射,你可以考虑例如一个TreeMap
。这些都是可迭代的。
答案 1 :(得分:2)
使用某种命名映射结构而不是像HashMap之类的数组怎么样? 这会将您的对象链接到一个唯一的键,然后您可以使用.remove(key)在完成后删除该对象。
不涉及真正的迭代,只是直接访问。
答案 2 :(得分:1)
您可以维护第二个数据结构,即阵列中“未使用”位置的简单列表。删除对象时,将对该阵列位置的引用或该阵列位置的索引推入列表。当您需要添加对象时,请从列表中取出第一个项目。当列表为空时,您可以像现在一样扫描数组,但是当列表不为空时,找到未使用的元素可以非常快速。 (您可以保留所有未使用位置的列表,这将删除全数组搜索,但保留10,000个未使用项目的列表似乎也过多。)
答案 3 :(得分:0)
您可以在列表中放置空格的索引到对象数组中。
答案 4 :(得分:0)
您可以使用HashSet
甚至HashMap
而不是使用数组,而无需担心打开的插槽或阵列可容纳的最大容量。您也无需担心在HashSet
或HashMap
中添加重复的对象。使用HashMap
,它允许您通过分配给对象的任何键来获取对象...使您的代码看起来更清晰,而不需要所有循环。
答案 5 :(得分:0)
您可以使用Object []并只保留第一个打开的插槽的索引。虽然,这几乎就是ArrayList的作用。
另外,请注意,通过10k项目的数组进行迭代,速度非常快。除非你证明这是一个问题,否则我不会担心那个时候。