Difference between Collections.sort() and getting a sorted collection by adding into a TreeSet?
1 2 3 4 5 6 7
| Set <Student > ts = new TreeSet <Student >();
for(Student s : studentInfo ){
ts. add(s );
}
System. out. println(ts ); |
为了对学生对象的集合进行排序,我在上面的一个case块中写了上面的代码片段。
我的问题是:使用这种方法和使用Collections.sort();方法有什么区别。
-
Collection.sort()可以使用比较器方法进行优化,比较器方法将根据您定义的属性对集合对象进行排序,您可以选择任何属性作为决策者,并创建一个比较类,用于定义具有该属性的比较方法
区别在于TreeSet始终保持数据排序,而Collections.sort()方法在Set上调用方法时对其进行排序。
Collections.sort()的时间复杂度是O(n*log(n)),而TreeSet的add()的复杂度是log(n)。如果使用相同大小的数据,那么TreeSet的情况下的复杂性将是相同的,因为您重复add操作n次。
因此,您只需要决定是否要在任何时候或仅在某个时刻订购Set。如果您的代码中存在不需要排序的情况,那么您不需要TreeSet但是如果您总是需要对它进行排序,那么您应该使用TreeSet。
请记住,如果你想对你的Set进行排序,你必须先从它创建一个List,这可能会带来一些开销!
另一个警告:正如其他人提到的那样TreeSet只能取1 Comparator,而你可以提供不同的Comparator到Collections.sort()。所以这取决于你的用法。您应该向我们提供有关您的用例的更多信息,以便给您一个彻底的答案。
-
当你的评论到达时我正在编辑我的答案。它就在那里。
-
在我的代码中还有其他情况我有添加/搜索/显示功能。
-
@AdamArold我创建的studentInfo是一个LinkedList,我在第一种情况下添加了Student对象。我已经使用TreeSet在第二个案例块中对同一个集合进行排序。
-
你应该只使用Collections.sort()。
-
BTW A set将删除重复项(由比较器定义),而List允许任意数量的重复项。
-
@AnjanBaradwaj如果要对它进行排序,ArrayList可能是更好的选择。在大多数情况下,ArrayList比LinkedList更可取。
-
@PeterLawrey我昨天曾就此问过一个问题。这是stackoverflow.com/questions/18734705/…
-
@AnjanBaradwaj ArrayList具有更高的最坏情况添加时间,但平均速度快很多倍。它还使用更少的内存(少至1/4)它的引用在内存中是连续的,使得随机但顺序访问更有效。
1)像所有Set一样的TreeSet拒绝重复值。
2)每次插入元素时,TreeSet都会保持排序,而使用Collections.sort()排序的列表只会在调用sort()之后进行排序(并且不会在add()时保持此排序)。
3)Collections.sort()允许使用不同的比较器对不同标准上的列表进行排序。使用TreeSet,您还可以提供Comparator,但是您需要为每个Comparator实例化一个TreeSet。
-
点3)不是必需的,因为你也可以向TreeMap提供Comparator。
-
我的意思是使用Sets,你需要为每个Comparator实例化一个TreeSet,而Collections.sort()允许用不同的Comparators对同一个列表进行排序。
-
@AdamArold您的意思是TreeSet吗?
-
是。内部TreeSet顺便使用Map。