我的数据结构类型为List<List<CustomObject>>
。我希望能够在我的数据结构中找到特定CustomObject
的位置。输出会显示例如索引。 1,0表示CustomObject
是第1个列表项中的第0个元素。
我已经考虑过以下几种方法来实现这个:
逐个遍历列表并比较CustomObject
。当然,我必须在equals
中实施CustomObject
方法进行比较。
使用indexOf方法计算出具有CustomObject
的数据结构的第一个索引。但是,在此中,等于的参数将为List<CustomObject>
。
有没有其他有效的方法来获取索引?
答案 0 :(得分:0)
迭代主列表并调用.contains()来检查对象是否存在。如果为true,请使用indexOf()来定位它。
您必须在对象中正确实现equals()和hashcode()。
答案 1 :(得分:0)
您还可以使用.lastIndexOf(Object o)方法直接在一次调用中获取对象的索引。如果列表中不存在该对象,则此方法将为-1。 查看文档以获取更多详细信息。 http://docs.oracle.com/javase/7/docs/api/java/util/List.html#lastIndexOf(java.lang.Object)
唯一的问题是这个方法只会给你最后一次出现的对象。如果列表中有重复的对象,则无效。
此外,您必须正确实现equals和hashcode方法才能进行正确的比较。
答案 2 :(得分:0)
indexOf
为你迭代,所以1)和2)实际上是相同的。如果您要查找的元素位于最后一个列表的最后一个插槽中,则会迭代整个数据集。
为了做得更好,您必须将索引显式存储在第二个数据结构中,以便进行更有效的搜索。在&#34;搜索&#34; 类别中获取来自http://bigocheatsheet.com/的数据结构 - 在java中的HashMap
- 您可以按以下方式执行此操作:
在HashMap<CustomObject, Index>
中,每个对象存储所需的索引。每次更新列表时都需要更新。更新和搜索项目只需要恒定的时间,换句话说,它与您拥有的元素数量无关。
有了这样的地图,您不会在列表中搜索,而是map.get(customObject)
并且您将获得结果。
您要回答的问题是:您是否能够始终如一地保持这样的数据结构,并且比在列表中搜索更省力。因为如果您以影响多个元素的方式更新列表,则可能会因为不断重做整个地图而失去所有好处。
除了使用多个数据结构外,可能还有1个比列表和地图更适合两种需求。但这取决于您的数据以及您需要如何访问它以及需要优化哪些部分。