代码之家  ›  专栏  ›  技术社区  ›  Jabba

LinkedList,按大小按升序插入元素

  •  0
  • Jabba  · 技术社区  · 14 年前

    ArrayList 可能不是一个好的选择,因为它在插入中间时将元素向右移位。我查看了 LinkedList ,但在列表中找不到用于在给定节点之前/之后插入的方法。有一个 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快。因为它不是同步的,所以也就不足为奇了。虽然差异不太显著。如果列表不太大(在我的例子中,最多可以有100000个元素),那么通过自己的实现,我获得了最好的性能。令人惊讶的是LinkedList的性能相当差。随着列表大小的增加,LinkedList越来越差。最后的结论:如果列表不太大,您可以通过自己的实现获得最佳性能。如果列表的大小很大,请使用ArrayList。

    额外信息: 在这四种情况下,当插入一个新元素时,我从一开始枚举列表,直到找到一个更大的元素,然后在它之前插入新节点。我这样做是因为应用程序需要处理较小的元素。所以我不做向量和数组的二进制搜索。

    6 回复  |  直到 12 年前
        1
  •  2
  •   Michael Borgwardt    14 年前

    我查看了LinkedList的API,但是 我找不到插入的方法

    它存在,但它隐藏在 ListIterator 接口返回 LinkedList.listIterator() 方法。

    这样做是为了避免暴露列表节点本身。

        2
  •  2
  •   Vincent Ramdhanie    14 年前

    如果列表中没有重复的元素,则可以考虑使用树集。树集为您保持元素的排序顺序。它保证了添加、删除等操作的日志(n)时间。

        3
  •  0
  •   Charlie Martin    14 年前

    (除了,杜恩,我想象中有一个分类列表。其他一些语言。)

    ArrayList排序可能会有帮助。

    [1] 以下内容: http://download.oracle.com/javase/1.4.2/docs/api/java/util/List.html#add(int ,java.lang.Object中)

        4
  •  0
  •   Daniel Fath    14 年前

    我在看Java API,Java中没有SortedList类。您可以使用java.util中的Collections实用程序,例如 Collections.sort(listToSort, comparator) [ 1 ]得到你想要的订单。

    TreeSet 或者自己做 SortedList 类,它环绕现有的列表接口并对ADD进行排序。

        5
  •  0
  •   Community CDub    8 年前

    在插入新元素之前,您需要对较小的元素执行什么类型的处理?

    在Java中,我想按大小按升序存储元素。 ,当我遇到一个较大的元素时,我想在这个较大的元素之前插入新节点。什么样的数据结构是最好的选择?

    我不知道你需要做什么,但你可能想看看 heap java.util.PriorityQueue 在爪哇。不过,考虑到 java.util.PriorityQueue 提供 但没有 排序迭代 元素的。见 Java: How do I use a PriorityQueue? 举个例子。

        6
  •  0
  •   BigMac66    14 年前

    TreeMap ? 只要你输入一个新值,它就会自动排序。

    DefaultMutableTreeNode )以及文档(如XML和DOM中)我在那里看到的问题,它们都允许一个节点有多个子节点,而我对纯 LinkedList

    希望这比我上一篇文章更有帮助。。。