Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中查找对象索引的有效方法_Java_Arraylist - Fatal编程技术网

Java 在ArrayList中查找对象索引的有效方法

Java 在ArrayList中查找对象索引的有效方法,java,arraylist,Java,Arraylist,我有一个ArrayList,我从ArrayList的末尾(即使用add(object)方法)以串行方式(即逐个)填充Integer类型的对象。每次我这样做,ArrayList中的其他对象当然会左移一个索引 在我的代码中,我想在ArrayList中找到随机对象的索引。我希望避免使用indexOf方法,因为我有一个非常大的ArrayList,循环将花费大量时间。有什么解决办法吗?你知道如何在一些数据结构中保存ArrayList中对象的索引吗 编辑:显然我的问题不清楚,或者我对arraylist.ad

我有一个ArrayList,我从ArrayList的末尾(即使用add(object)方法)以串行方式(即逐个)填充Integer类型的对象。每次我这样做,ArrayList中的其他对象当然会左移一个索引

在我的代码中,我想在ArrayList中找到随机对象的索引。我希望避免使用indexOf方法,因为我有一个非常大的ArrayList,循环将花费大量时间。有什么解决办法吗?你知道如何在一些数据结构中保存ArrayList中对象的索引吗

编辑:显然我的问题不清楚,或者我对arraylist.add(object)方法有错误的理解(这也是很有可能的!)。我想做的是有一个类似滑动窗口的东西,对象插入arraylist的一端,从另一端删除,当一个对象插入到一端时,其他对象会移动一个索引。我可以使用arraylist.add(0,object)从arraylist的左侧插入对象,每次将前面的对象右移一个索引,但在谷歌搜索时,我发现这是一个非常需要处理的操作——如果我没记错的话,是O(N)。因此,我想“好吧,让我们从arraylist的右端插入对象,没问题!”,假设每次插入都会将以前的对象移动一个索引(这次向左)


此外,当我使用术语“索引”时,我只是指对象在ArrayList中的位置-可能还有一些更正式的术语“索引”,它的意思不同。

您有几个选项。以下是两个基本选项:

  • 您可以维护一个
    映射
    ,该映射与数组并行地保存索引。将元素附加到数组时,只需将其添加到映射即可。当您从一开始就删除一个元素时,您必须遍历整个映射,并从每个索引中减去一个元素

  • 如果它适合您的情况,并且
    映射
    不符合您的性能要求,则可以将
    索引
    字段添加到对象中,并在将其添加到数组时直接存储索引。从一开始删除元素时,必须遍历列表中的所有对象,并从其索引中减去一个。然后,您可以在给定对象的恒定时间内获得索引

  • 在删除后更新索引仍然会影响性能。现在,选择其中一个选项后,如果您进行了简单的改进,就可以避免在删除后迭代地图/列表进行更新:

    与其存储每个对象的索引,不如存储到目前为止添加的对象总数的计数。然后,要获得实际索引,只需将第一个对象的计数值从您要查找的对象的值中减去即可。例如,当您添加:

    add a to end;
    a.counter = counter++;
    remove first object;
    
    (启动程序时,
    计数器
    的初始值实际上并不重要。)然后要查找对象“x”:

    是将
    计数器
    存储为新字段还是存储在地图中取决于您。希望有帮助

    顺便说一下;从列表前面删除对象时,链表的性能更好,但按索引访问对象时性能更差。这可能更合适,这取决于添加/删除与随机访问之间的平衡(如果您只关心索引,但实际上不需要按索引检索对象,那么随机访问性能并不重要)。如果你真的需要进一步优化,你可以考虑使用一个固定容量的环形缓冲区(后面插入,前移,随机访问都是O(1))。
    当然,选项3是在更高的层次上重新考虑你的算法;也许有一种方法可以完成您正在寻找的行为,而不需要在列表中查找对象。

    您有两种选择。以下是两个基本选项:

  • 您可以维护一个
    映射
    ,该映射与数组并行地保存索引。将元素附加到数组时,只需将其添加到映射即可。当您从一开始就删除一个元素时,您必须遍历整个映射,并从每个索引中减去一个元素

  • 如果它适合您的情况,并且
    映射
    不符合您的性能要求,则可以将
    索引
    字段添加到对象中,并在将其添加到数组时直接存储索引。从一开始删除元素时,必须遍历列表中的所有对象,并从其索引中减去一个。然后,您可以在给定对象的恒定时间内获得索引

  • 在删除后更新索引仍然会影响性能。现在,选择其中一个选项后,如果您进行了简单的改进,就可以避免在删除后迭代地图/列表进行更新:

    与其存储每个对象的索引,不如存储到目前为止添加的对象总数的计数。然后,要获得实际索引,只需将第一个对象的计数值从您要查找的对象的值中减去即可。例如,当您添加:

    add a to end;
    a.counter = counter++;
    remove first object;
    
    (启动程序时,
    计数器
    的初始值实际上并不重要。)然后要查找对象“x”:

    是将
    计数器
    存储为新字段还是存储在地图中取决于您。希望有帮助

    顺便说一下;从列表前面删除对象时,链表的性能更好,但按索引访问对象时性能更差。这可能更合适,这取决于添加/删除与随机访问之间的平衡(如果您只关心索引,但实际上不需要按索引检索对象,那么随机访问性能并不重要)。如果您真的需要进一步优化,可以考虑使用固定容量的环形缓冲区(后退插入)。