[英]What's the most efficient way to insert a string into an already-sorted array list of strings?
我有一個ArrayList,里面有17,000個單詞。 我只需要在列表中添加一個單詞,如果它還沒有,我需要保留列表的排序順序。 即,我需要將其放入按字母順序排列的正確位置。
我不知道如何找到插入它的正確位置。 我正在使用二進制搜索來查找該單詞是否已經在列表中,如果它在那里則返回索引,如果不是則返回-1。 我打算使用ArrayList.add(int index,E element)將其放入。
將ArrayList
轉換為TreeSet
http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html
TreeSet
將為您處理重復項,並按字母順序保留單詞。
示例:( WordList
是單詞的ArrayList
)
TreeSet<String> WordSet = new TreeSet<String>(WordList);
使用內置的binarySearch
方法。 如果找不到密鑰,則返回的是
-(insertionIndex) - 1
想到二進制搜索 ,列表api可能包含更好的內容
在二進制搜索中,您將到達剩下2個項目的位置,一個位於上方,一個位於下方,其中一個可能==指向您的項目。 對於您的情況,您將沒有==大小寫,因此返回較高的索引並插入其位置。 我不知道java是否有元組類,或者你可以構建一個容器。 無論哪種方式,返回類似的東西:
(bool, int) binSearch(IList list)
returns true, -1 if found
returns false, higher of 2 bounds otherwise
顯然這不是java,但它不是一個延伸轉換
如果您編寫了二進制搜索,則可以對其進行修改以返回搜索到的最后一個值。 此值可以是匹配字符串的位置,也可以是應插入的位置。
這是在二進制搜索中,您細分列表,直到您找到該字符串或無法進一步細分它。 您不能再細分列表的位置是應插入字符串的位置。
為了強化一個過程,我們都知道,一般的想法就是使用更多的內存。 這里,它可以是每個字母的第一個字符串的索引。 例如,另一個ArrayList,寫入偽:
ArrayList indexes;
indexes[0] = {"a", 0};
indexes[1] = {"b", 123};
...
對於以“a”開頭的字符串,您可以在索引0-123之間進行二進制搜索。
如果沒有重復的話,正如你所說,你可以考慮實施一個特里 。 對trie的插入操作比哈希表中的插入操作要快一些,因為沒有沖突。 搜索也是如此。
此外,在ArrayList
中,要在列表中間插入元素,這意味着重新定位元素的一半或增加數組大小,這可能有些昂貴。
如果您很好奇,可以在以下頁面中看到實現: https : //forums.oracle.com/forums/thread.jspa?messageID = 8877521
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.