在Java中,我希望按大小按升序存储元素。在插入之前,我需要处理所有较小的元素。所以我开始枚举处理较小元素的列表,当我遇到一个更大的元素时,我想在这个更大的元素之前插入新节点。什么数据结构是个不错的选择? ArrayList
可能不是一个好选择,因为它在插入中间时将元素向右移动。我查看了LinkedList
的API,但是我找不到在列表中给定节点之前/之后插入的方法。有一个add
方法“将指定的元素插入此列表中的指定位置”,但它需要将位置作为整数。那么它是否意味着Java实现从头开始遍历列表直到找到指定的位置?这看起来很贵。我有要插入的位置(节点),只需要正确更改一些引用以在列表中包含新节点。有什么建议吗?
谢谢,
贾巴
更新:谢谢大家的答案,我可以使用ListIterator解决LinkedList的问题。然后我做了一个比较测试,我得到了一些令人惊讶的结果。因此,目标是以排序的方式维护列表/数组中的元素。为此,我比较了四种选择:(1)Vector,(2)ArrayList,(3)LinkedList,以及(4)MyLinkedList,这是我自己的实现(非常简单)。为了测试,我创建了一个包含1000个元素的数组,然后用1到100之间的随机整数填充它。然后我在循环中的每个容器中添加了这些元素。当这个数组被添加30次时:MyLinkedList(2.7秒),LinkedList(6.6秒),ArrayList(6.9秒),Vector(7.5秒)。添加阵列100次:MyLinkedList(80.7秒),ArrayList(82.5秒),Vector(92.7秒),LinkedList(176.3秒)。添加阵列200次:ArrayList(304.3秒),Vector(332.7秒),MyLinkedList(381.2秒),LinkedList(610.4秒)。 结论: ArrayList总是比Vector快。由于它没有同步,所以并不是很令人惊讶。虽然差异不是很大。如果列表不是太大(在我的情况下最多100,000个元素),我通过自己的实现获得了最佳性能。令人惊讶的是LinkedList表现很差。随着列表大小的增长,LinkedList越来越差。最后的结论:如果列表不是太大,您可以通过自己的实现获得最佳性能。如果列表的大小非常大,请使用ArrayList。 这个结果让我感到惊讶,因为ArrayList必须移动大量元素,而链表只需要更改一些引用。但由于ArrayList基于数组,尽管转换次数很多,但它可以胜过链表。
额外信息:在所有四种情况下,当插入新元素时,我从头开始枚举列表,直到找到更大的元素,然后在它之前插入新节点。我这样做是因为应用程序需要处理较小的元素。这就是我不在Vector和ArrayList上进行二进制搜索的原因。
答案 0 :(得分:2)
如果列表中没有重复元素,则可以考虑使用TreeSet。 TreeSet为您保留按顺序排列的元素。它保证了添加,删除等的log(n)时间。
答案 1 :(得分:2)
我查看了LinkedList的API,但是 我没有找到插入方法 在列表中给定节点之前/之后。
它存在,但隐藏在LinkedList.listIterator()
方法返回的ListIterator
接口中。
这样做是为了避免暴露列表节点本身。
答案 2 :(得分:0)
嗯,首先想到的是你可以使用SortedList,它可以立即为你解决问题。
(除了,durn,SortedList在我的想象中。还有其他语言。)
ArrayList#sort可能有帮助。
如果失败了,你需要一个实现[双参数添加方法] [1]的List实现。
[1]:http://download.oracle.com/javase/1.4.2/docs/api/java/util/List.html#add(int,java.lang.Object)
答案 3 :(得分:0)
我正在研究Java API,而Java中没有SortedList类。您可以使用java.util中的Collections utils,例如Collections.sort(listToSort, comparator)
[1]来获取所需的顺序。
您必须使用TreeSet
或创建自己的SortedList
类,它包装现有的List接口并在添加时进行排序。
答案 4 :(得分:0)
在插入新元素之前,您需要对较小的元素进行哪种处理?
在Java中,我希望按大小按升序存储元素。 在插入之前,我需要处理所有较小的元素。所以我开始枚举处理较小元素的列表,当我遇到一个更大的元素时,我想在这个更大的元素之前插入新节点。什么数据结构是个不错的选择?
我不太了解您需要做什么,但您可能希望查看在Java中以heap实现的java.util.PriorityQueue
数据结构。不过,请考虑java.util.PriorityQueue
提供元素的排序删除但不包含元素的排序迭代。有关示例,请参阅Java: How do I use a PriorityQueue?帖子。
答案 5 :(得分:0)
你看过TreeMap
了吗?一旦你输入新值,它就会自动排序。
我还查看了Trees(在DefaultMutableTreeNode
中)和Documents(在XML和DOM中)我在那里看到的问题,他们都允许节点有多个子节点而我对纯{{1是每个节点只有一个父节点和一个子节点。
希望这比我上一篇文章更有帮助......