簡體   English   中英

在java中的給定索引處有效地在ArrayList中添加元素

[英]Add element in an ArrayList efficiently at a given index in java

我需要在索引i的ArrayList中插入Person類型的元素(我自己定義的類)

我知道我可以使用add(int index, E element)

但是有沒有任何有效的方法來做到這一點,因為在我的列表中平均花費大約1.5毫秒(收集的數據超過1000插入,然后平均)。

如果您的任務是更多插入/刪除密集,您可以始終使用java.util.LinkedList

  • ArrayList的大小有限。 每次添加元素時,Java都會確保它適合 - 因此它會增加ArrayList。 如果ArrayList增長得更快,將會發生大量的數組復制。
  • LinkedList只是將元素添加到正確的位置(鏈接節點周圍),而不會增長和復制整個ArrayList。
  • 當您搜索元素時,LinkedList的缺點是。 由於它沒有索引,因此必須從列表的開頭到結尾遍歷才能找到項目。

對於LinkedList

  • 得到的是O(n)
  • 加是O(1)
  • 刪除是O(n)
  • Iterator.remove是O(1)

對於ArrayList

  • 得到的是O(1)
  • add是O(1)攤銷,但O(n)最壞情況,因為必須調整和復制數組
  • 刪除是O(n)

這種插入發生在O(n)中,因為它必須將所有元素向下移動,而在最壞情況下它會將每個元素向下移動。 (更正了java說它是O(n),因為它們使用數學公式來插入)

如果你想快速插入,可以在arraylist的末尾添加它,或者使用一個恆定時間的hashmap。

插入hashmap:HashMap peopleMap = new Hashmap .....

peopleMap.put(person.name,person); //(或任何你想跟蹤的)

這為人名和人的價值設定了關鍵。

您還可以嘗試使用密鑰(您想要跟蹤的密碼)的哈希映射,並為該人在持有者數組中的索引值。 插入是O(i),查找O(i),你也可以對它進行排序(我將把它作為練習留給讀者)

如果這個的整個目的是排序,那么為了簡單起見,你可以插入一個priorityQueue(nLogn),然后將所有內容彈出到數組中,這將為你提供一個排序數組

如果你添加使用

arryListInstance.add(positionIndex, Object);

在將現有對象篩選1個位置后添加對象。 . 因此,該操作的平均情況變為

雖然簡單添加

arryListInstance.add(positionIndex, Object);

在arrayListInstance的末尾添加對象。 , but at it's worst case it becomes when the maximum capacity is reached: as a new ArrayList instance is created internally and all the contents are copied there. 在最好的情況下,此操作是 ,但在最壞的情況下,當達到最大容量時它變為 :因為在內部創建了新的ArrayList實例並且在那里復制了所有內容。

您正面臨這個問題,因為可以避免第一個的兩個原因之一:

  1. 您尚未為ArrayList對象定義足夠的初始容量。 a new arrayListInstance is being created with increased capacity and then the existing elements from the original list are being copied and then finally is being performed. 因此,在每個之前正在創建具有增加容量的新arrayListInstance ,然后復制原始列表中的現有元素,然后最終執行 如果您確切知道此列表要處理的數據量並相應地定義初始容量(與可能的元素數量相同),則可以避免這種情況。 . 如果您無法預測初始容量,那么最好處理數據。
  2. 在除最后一個位置之外的任何位置的每次插入之后導致現有元素的篩選。 這是不可避免的。 will be performed in time if is not the last index of the arrayList. 因此,如果不是arrayList的最后一個索引,則將在時間內執行 you cann't achieve constant time add operation which adds an element into the list at an index other than after the last element. 即使您使用也無法實現常量時間添加操作,該操作會在除最后一個元素之外的索引處將元素添加到列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM