【问题标题】:Difference between Collections.sort() and getting a sorted collection by adding into a TreeSet?Collections.sort() 和通过添加到 TreeSet 中获取排序集合之间的区别?
【发布时间】:2023-03-06 09:57:02
【问题描述】:
 Set<Student> ts = new TreeSet<Student>();

    for(Student s : studentInfo){
         ts.add(s);
    }

    System.out.println(ts);

为了对学生对象的集合进行排序,我在我的一个案例块中的 sn-p 上面写了这个。 我的问题是:使用这种方法和使用Collections.sort(); 方法有什么区别。

【问题讨论】:

  • Collection.sort() ,可以使用比较器方法进行优化,它会根据您定义的属性对集合对象进行排序,您可以选择任何属性作为决定者并创建一个比较类使用该属性定义比较方法

标签: java algorithm data-structures collections


【解决方案1】:

不同之处在于TreeSet 始终让您的数据保持排序,而Collections.sort() 方法在您调用Set 上的方法时对其进行排序。

Collections.sort() 的时间复杂度是O(n*log(n)),而TreeSetadd() 的复杂度是log(n)。如果您使用相同大小的数据,那么TreeSet 的复杂性将是相同的,因为您重复了add 操作n 次。

因此,您只需决定是要始终订购您的Set 还是仅在某个时候订购。如果您的代码中有不需要排序的情况,那么您不需要TreeSet,但如果您总是需要对其进行排序,那么您应该使用TreeSet

请记住,如果您想对Set 进行排序,您必须先从中创建一个List,这可能会带来一些开销!

另一个警告: 正如其他人提到的那样,TreeSet 只能接受 1 个 Comparator,而您可以向 Collections.sort() 提供不同的 Comparators。所以它取决于您的使用情况。您应该向我们提供有关您的用例的更多信息,以便为您提供全面的答案。

【讨论】:

  • 您的评论到达时我正在编辑我的答案。它现在在那里。
  • 在我的代码中还有其他情况,我有添加/搜索/显示功能。
  • @AdamArold 我创建的 studentInfo 是一个LinkedList,我在第一种情况下添加了 Student 对象。我已经使用TreeSet 在第二个案例块中对相同的集合进行排序。
  • 那么你应该使用Collections.sort()
  • @AnjanBaradwaj ArrayList 的最坏情况添加时间更长,但平均速度要快很多倍。它还使用更少的内存(只有 1/4)它的引用在内存中是连续的,使得随机但顺序访问更有效率。
【解决方案2】:

1) 像所有 Set 一样的 TreeSet 拒绝重复值。

2) TreeSet 会在您每次插入元素时维护排序,而使用 Collections.sort() 排序的列表只会在调用 sort() 后进行排序(并且不会在 add() 时保持这种排序)。

3) Collections.sort() 允许使用不同的比较器根据不同的标准对列表进行排序。使用 TreeSet,您还可以提供一个 Comparator,但您需要为每个 Comparator 实例化一个 TreeSet。

【讨论】:

  • 第 3 点)不是必需的,因为您也可以将 Comparator 提供给 TreeMap
  • 我的意思是,使用 Sets,您需要为每个 Comparator 实例化一个 TreeSet,而 Collections.sort() 允许使用不同的 Comparator 对相同的列表进行排序。
  • @AdamArold 你是说TreeSet吗?
  • 是的。顺便说一下,内部TreeSet 使用Map
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多