【问题标题】:TreeSet and compareTo() method. Single sort or multiple sortsTreeSet 和 compareTo() 方法。单排序或多排序
【发布时间】:2013-08-26 20:44:52
【问题描述】:

我目前正在开发一个程序,我使用TreeSet 来存储唯一键。我正在使用 TreeSet,因为我希望它们被排序。

到目前为止,我一直在制作 TreeSet 对象,并在需要时一次添加一个字符串。

TreeSet set = new TreeSet();
set.add("How");
set.add("Are");
set.add("You");

据说,TreeSet 使用Compareable interface 中的compareTo 方法对字符串进行排序。这意味着每次我向 TreeSet 添加字符串时,它都必须进行排序。

现在我的问题是:创建一个HashSet,然后在将all strings 添加到HashSet 后创建TreeSet 会更有效吗?

TreeSet<String> treeSet = new TreeSet<String>(set);

我的想法是 TreeSet 是否只需要以这种方式进行一次排序。

提前致谢

【问题讨论】:

  • 否;你误解了 BST。
  • TreeSet 不需要在每次插入字符串时进行排序。更有可能的是,它使用compareTo 来确定在遍历树插入新元素时是取左子树还是取右子树。
  • 想象你有一个书架,所有的书都按字母顺序排列。如果你买了一本新书,想把它放在书架上合适的地方,你是不是必须把已经在书架上的所有书重新分类?
  • 此外,从 HashSet 创建 TreeSet 将简单地一一添加所有键。
  • 我明白你的意思,谢谢:)

标签: java hashset compareto treeset


【解决方案1】:

TreeSet 是一个Self-balancing binary search tree。这意味着它将为每个插入进行log(n, 2) 比较。如果您单独添加元素或从另一个集合创建TreeSet,则没有区别。

【讨论】:

  • 我明白了——我现在继续编程。谢谢你的回答:)
【解决方案2】:

不会有任何区别,因为它在内部调用了“addAll()”方法,而该方法又一次添加一个元素

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    Iterator<? extends E> e = c.iterator();
    while (e.hasNext()) {
        if (add(e.next()))    //< -- Add one element at a time
           modified = true;
    }
    return modified;
}

【讨论】:

    【解决方案3】:

    ConcurrentSkipListSet 可能会提供更好的性能,具体取决于。

    这是基于排序的SkipList 的实现。渐近性能与 TreeSet 一样是 O(log n),但它通常应该更快,并且存储更紧凑。另外,java 已经包含了implementation

    根据实现,从排序的数组列表创建跳过列表列表可能会更快。批量添加通常比逐个添加更快(取决于实现)。 TreeSet 代表某种异常。分析并找出答案!

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多