在多维列表

时间:2015-11-21 01:19:55

标签: java arraylist

我的数据结构类型为List<List<CustomObject>>。我希望能够在我的数据结构中找到特定CustomObject的位置。输出会显示例如索引。 1,0表示CustomObject是第1个列表项中的第0个元素。

我已经考虑过以下几种方法来实现这个:

  1. 逐个遍历列表并比较CustomObject。当然,我必须在equals中实施CustomObject方法进行比较。

  2. 使用indexOf方法计算出具有CustomObject的数据结构的第一个索引。但是,在此中,等于的参数将为List<CustomObject>

  3. 有没有其他有效的方法来获取索引?

3 个答案:

答案 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个比列表和地图更适合两种需求。但这取决于您的数据以及您需要如何访问它以及需要优化哪些部分。