java sortedlist 用法_为什么Java中没有SortedList?

列表迭代器首先保证按照列表的内部顺序(也就是列表的内部顺序)获得列表的元素。插入顺序)。更具体地说,它是按照插入元素的顺序或如何操作列表的顺序进行的。排序可以看作是对数据结构的操作,有几种方法可以对列表进行排序。

我会按有用性我个人认为:

1.考虑使用Set或Bag集合代替

注:我把这个选项放在最上面,因为这是你通常想要做的事情。

排序集在插入时自动对集合进行排序。,这意味着它在将元素添加到集合时执行排序。这也意味着您不需要手动对其进行排序。

此外,如果您确信不需要担心(或有)重复的元素,则可以使用TreeSet相反。它实现SortedSet和NavigableSet接口和工作方式,正如您从列表中所期望的那样:TreeSet set = new TreeSet();set.add("lol");set.add("cat");

// automatically sorts natural order when addingfor (String s : set) {

System.out.println(s);}// Prints out "cat" and "lol"

如果不想使用自然排序,可以使用构造函数参数,该构造函数参数采用Comparator.

或者,您可以使用多集(亦称袋),那是一个Set它允许重复的元素,而存在第三方实现。最值得注意的是番石榴图书馆有一个TreeMultiset,这在很大程度上类似于TreeSet.

2.对你的名单进行排序Collections.sort()

如前所述,对Lists是对数据结构的操作。因此,对于需要“一个真相来源”的情况,需要以各种方式进行排序,然后手动地对其进行排序才是可行的方法。

属性对列表进行排序。java.util.Collections.sort()方法。下面是一个代码示例,说明如何:List strings = new ArrayList()strings.add("lol");strings.add("cat");Collections.sort(strings);for (String s : strings) {

System.out.println(s);}// Prints out "cat" and "lol"

使用比较器

一个明显的好处是你可以使用Comparator在sort方法。Java还为Comparator例如Collator这对于区分区域设置的排序字符串很有用。以下是一个例子:Collator usCollator = Collator.getInstance(Locale.US);usCollator.setStrength(Collator.PRIMARY);

// ignores casingCollections.sort(strings, usCollator);

并发环境中的排序

请注意,使用sort方法在并发环境中不友好,因为集合实例将被操作,因此您应该考虑使用不可变集合。这是番石榴在Ordering类是一个简单的一行:List sorted = Ordering.natural().sortedCopy(strings);

3.用java.util.PriorityQueue

尽管Java中没有排序列表,但是有一个排序队列,它可能对您同样有效。这是java.util.PriorityQueue班级,等级。

Nico Haase在评论中将相关问题这也回答了这个问题。

在已排序的集合中你很可能不想操纵内部数据结构,这就是PriorityQueue不实现List接口的原因(因为这会让您直接访问它的元素)。

关于PriorityQueue迭代器

这个PriorityQueue类实现Iterable和Collection接口,这样就可以像往常一样迭代。但是,迭代器不能保证按排序顺序返回元素。相反(正如Alderath在评论中所指出的),您需要poll()排队直到空无一人。List strings = new ArrayList()strings.add("lol");strings.add("cat");

PriorityQueue sortedStrings = new PriorityQueue(strings);while(!sortedStrings.isEmpty()) {

System.out.println(sortedStrings.poll());}// Prints out "cat" and "lol"

4.自己写SortedList班级,等级

注:你不应该这么做。

您可以编写自己的List类,在每次添加新元素时对其进行排序。根据您的实现,这可能会带来相当大的计算量。毫无意义,由于两个主要原因,除非您想将其作为一项练习来做:它违反了合同

List接口具有,因为

add方法应确保元素驻留在用户指定的索引中。

为什么要重新发明方向盘?您应该使用TreeSet或Multiset,如上面第一点所指出的那样。

但是,如果您想要将其作为一个练习来完成-这里是一个代码示例-让您开始学习,那么它将使用AbstractList摘要班:public class SortedList extends AbstractList {

private ArrayList internalList = new ArrayList();

// Note that add(E e) in AbstractList is calling this one

@Override

public void add(int position, E e) {

internalList.add(e);

Collections.sort(internalList, null);

}

@Override

public E get(int i) {

return internalList.get(i);

}

@Override

public int size() {

return internalList.size();

}}

注意,如果您尚未重写所需的方法,则AbstractList会扔UnsupportedOperationExceptionS.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值