Java列表排序:有没有办法像TreeMap一样自动对列表进行永久排序?

2022-08-31 16:37:48

在Java中,您可以构建一个带有项,然后调用:ArrayList

Collections.sort(list, comparator);

在列表时,是否有无论如何都要传递比较器,创建就像您可以做的一样?TreeMap

目标是能够将元素添加到列表中,而不是将其自动附加到列表的末尾,列表将根据 保持自身排序,并将新元素插入由 .因此,基本上列表可能必须在添加的每个新元素时重新排序。ComparatorComparator

无论如何,是否有通过这种方式或通过其他类似方式实现这一目标?Comparator


答案 1

您可以更改 ArrayList 的行为

List<MyType> list = new ArrayList<MyType>() {
    public boolean add(MyType mt) {
         super.add(mt);
         Collections.sort(list, comparator);
         return true;
    }
}; 

注意:优先级队列不是列表,如果您不关心它是什么类型的集合,最简单的方法是使用TreeSet,它就像TreeMap一样,但是一个集合。优先级队列的唯一优点是允许重复项。

注意:对于大型集合,诉诸不是很有效,使用二进制搜索和插入条目会更快。(但更复杂)

编辑:很大程度上取决于你需要“列表”做什么。我建议你为ArrayList,LinkedList,PriorityQueue,TreeSet或其他排序集合之一编写一个List包装器,并实现实际使用的方法。这样,您就可以很好地了解集合的要求,并且可以确保它适合您。

编辑(2):因为对使用二进制搜索有如此多的兴趣。;)

List<MyType> list = new ArrayList<MyType>() {
    public boolean add(MyType mt) {
        int index = Collections.binarySearch(this, mt);
        if (index < 0) index = ~index;
        super.add(index, mt);
        return true;
    }
};

答案 2

每个人都在建议.但是,重要的是要认识到,如果循环访问 的内容,则元素将不会按排序顺序排列。您只能保证从方法 、等中获取“最小值”元素。PriorityQueuePriorityQueuepeek()poll()

A 似乎更合适。需要注意的是,作为一个 ,它不能包含重复的元素,并且不支持使用索引进行随机访问。TreeSetSet


推荐