Java 什么';将字符串插入已排序的字符串数组列表的最有效方法是什么?

Java 什么';将字符串插入已排序的字符串数组列表的最有效方法是什么?,java,string,arraylist,add,Java,String,Arraylist,Add,我有一个ArrayList,里面有17000个单词。我只需要在列表中添加一个单词,如果它还没有在列表中,我需要保留列表的排序顺序。i、 我需要把它放在字母顺序正确的位置 我不知道如何找到正确的插入位置。 我使用二进制搜索来查找单词是否已经在列表中,如果它在列表中,则返回索引;如果不在列表中,则返回-1。 我曾计划使用ArrayList.add(int index,E element)将其放进去。想到,list api可能包含更好的内容 在二进制搜索中,您将得到一个点,您有两个项目,一个在上面,一

我有一个ArrayList,里面有17000个单词。我只需要在列表中添加一个单词,如果它还没有在列表中,我需要保留列表的排序顺序。i、 我需要把它放在字母顺序正确的位置

我不知道如何找到正确的插入位置。
我使用二进制搜索来查找单词是否已经在列表中,如果它在列表中,则返回索引;如果不在列表中,则返回-1。 我曾计划使用ArrayList.add(int index,E element)将其放进去。

想到,list api可能包含更好的内容

在二进制搜索中,您将得到一个点,您有两个项目,一个在上面,一个在下面,其中一个可能==到您的项目。对于您的案例,您将没有==案例,因此返回较高的索引并在其位置插入。我不知道java是否有元组类,或者您是否可以构建一个容器。不管是哪种方式,返回如下内容:

(bool, int) binSearch(IList list)
  returns true, -1 if found
  returns false, higher of 2 bounds otherwise

很明显,这不是java,但转换也不是一种延伸。如果编写二进制搜索,则可以修改它以返回上次搜索的值。该值可以是匹配字符串的位置,也可以是插入该字符串的位置


也就是说,在二进制搜索中,您可以细分列表,直到找到字符串或无法再细分它为止。不能再细分列表的位置就是应该插入字符串的位置。

为了加快进程,我们想到的一般想法是使用更多内存,我们都知道。在这里,它可以是每个字母的第一个字符串的索引。例如,一个附加的ArrayList,用pseudo编写:

ArrayList indexes;
indexes[0] = {"a", 0};
indexes[1] = {"b", 123};
...

对于以“a”开头的字符串,可以在索引0-123之间进行二进制搜索。

使用内置方法。如果没有找到密钥,返回的数字是
<代码> -(插入索引)-1

< P>如果没有重复的单词,如您所说,可以考虑实现A。trie上的插入操作比哈希表中的插入操作要快一些,这是因为没有冲突。搜索也是如此

此外,在<代码> ARAYLIST/<代码>中,在列表中间插入一个元素,这意味着重新定位元素的一半或增加数组的大小,这可能有点贵。p>


如果您感兴趣,可以在下面的页面中看到一个实现:

ArrayList
转换为
TreeSet

TreeSet
将为您处理重复项,并按字母顺序保留单词

示例:(
WordList
是单词的
ArrayList

TreeSet单词集=新的TreeSet(单词列表);

请在您的问题中添加相关的语言标记。您可以对二进制搜索进行一个小的更改,使其返回项目的索引(如果找到),或者返回下一个项目的索引(如果未找到)。这些词在所有情况下都是重复的或唯一的?@trutheality将我推向了正确的方向。如果找不到,则返回上次搜索的负索引值。然后我只是在负索引处插入单词。我使用二进制搜索查找单词是否已经在列表中,如果单词在列表中,则返回索引;如果不在列表中,则返回-1。我想在类中添加一个变量,如果找不到单词,但由于赋值限制,该变量将设置为最接近的值(来自我的教授),我不能有另一个变量..伪代码:如果return==-1,则将最接近的索引值设置为Var。在Var-1处添加单词。如果不能有另一个变量,则使用另一个方法。或者,如果您不能添加这些代码,那么将代码放在该方法的其他地方,我想我是对的“列表api可能包含更好的代码”。在我看来,这是正确的答案。这就是我试图用我的答案说的,我只是不知道java API。这是最好的方法,不会因为使用其他数据结构而导致内存膨胀。+1如果要将值链接到字符串,Java语言最好使用SortedMap对列表进行排序。考虑一个加法。。。如果将列表存储在hashset中,并且仅在需要排序时转换为TreeSet,则可以节省处理器时间。这是因为在转换为树集时,只对数据排序一次。否则,每次添加项目时都会进行排序…+1;我只是随便浏览一下,碰巧看到了这个。你就是Arduino网站上的人,对吗?小世界!:皮亚姆!:)这的确是一个小世界
TreeSet<String> WordSet = new TreeSet<String>(WordList);