【问题标题】:Sorted List in java like TreeMap or SortedSet [duplicate]Java中的排序列表,如TreeMap或SortedSet [重复]
【发布时间】:2012-11-05 16:27:08
【问题描述】:

我们在 java 中是否有像 SortedSet 或 TreeMap 一样的排序列表?我有一个类,其中一个属性是对象列表。在添加或通过设置器(set(List list))设置它时,必须随时对该列表进行排序。

我们有像 TreeMap 这样的组件吗?任何建议或帮助都将非常重要。提前致谢。

【问题讨论】:

  • 为什么需要它成为一个列表?如果它必须是一个列表,您可以使用二进制搜索插入或调用 Collection.sort() 每个计时器。没有集合会重新排序您更改集合中的元素。

标签: java collections


【解决方案1】:

拥有一个列表的目的是它们应该保持添加它们的元素的顺序。所以,我相信没有这样的List 实现,其中元素在添加时进行排序。

您可以随时使用Collections.sort() 方法对列表进行排序。

【讨论】:

  • +1 正是 - 如果元素不会在那里结束,那么像 add(int index, E element) 这样的方法有什么意义?只是界面不对。
【解决方案2】:

你想要的是一个排序好的Bag/MultiSet实现,比如Google GuavaTreeMultiSet

Guava 中的 TreeMultiSet 定义为:

一个保持其元素顺序的多重集,根据 它们的自然顺序或显式比较器。

MultiSet 是:

支持顺序无关相等的集合,如 Set,但 可能有重复的元素。多重集有时也称为

有关 MultiSets 的更多信息,您可以阅读Google Guava: MultiSets 上的这篇 dzone 文章(除非您真的想要 TreeMultiSet),以及 Guava wiki 的此页面 explaining their new collection types .

【讨论】:

  • MultiSetList 完全不同。
  • @PaulBellora:是的,如果你认为它是一个真实的集合,它应该只有独特的元素,但事实并非如此。从 OP 的问题来看,这正是他所追求的。
  • @PaulBellora:我认为如果 OP 的 API 依赖于 List 接口可能会很烦人。但是 MultiSet 实现了Collection 接口,所以这似乎是一个相对容易解决的问题。
  • MultiSet.iterator 文档没有说明插入顺序。 entrySet 等其他方法的顺序未指定。很难看出这个接口如何匹配List
  • @PaulBellora:试试看,你会看到的。此外,OP 没有说任何关于插入顺序的内容,而是关于想要一个可以保持排序的类似列表的数据结构。 MultiSet.iterator() 只是保证您将按照底层比较器定义的顺序取回项目。此外,正如您在对另一个答案的评论中提到的那样,List 似乎无论如何都不是用于此目的的正确界面,因此这不会“与List 匹配”是有道理的:它看起来他并不是真的想要List
【解决方案3】:

您可以为Collection 使用其他数据类型,因为您不关心元素的顺序(这是List 的基本属性)。例如,我认为SortedSet 可以在没有重复项的情况下解决问题。

否则,您可以在 List 上使用 Collections.sort()

【讨论】:

    【解决方案4】:

    您可以扩展现有的ArrayList 来创建SortedList。因为您只需要在插入时处理订单。

    public class SortedList<E extends Comparable<E>> extends ArrayList<E> {
    
        @Override
        public boolean add(E e) {
            int index = Collections.binarySearch(this, e);
            super.add(index < 0 ? ~index : index, e);
            return true;
        };
    }
    

    Java 文档Collections.binarySearch

    返回:搜索键的索引,如果它包含在列表中;否则,(-(insertion point) - 1)。插入点定义为将键插入列表的点:第一个元素的索引大于键,如果列表中的所有元素都小于指定的键,则为 list.size()。请注意,这保证了当且仅当找到密钥时返回值将是&gt;= 0

    更新: 正如@Louis Wasserman 指出的那样,这会为基于索引的插入元素的基本列表合同带来问题。如果您想支持该功能,那么您应该使用Collections.sort()。您还可以使用org.apache.commons.collections.list.TreeList,该类具有以下相对性能统计信息

                  get  add  insert  iterate  remove
    TreeList       3    5       1       2       1
    ArrayList      1    1      40       1      40
    LinkedList  5800    1     350       2     325
    

    【讨论】:

    • 您意识到这违反了List 合同并且会弄乱各种代码,对吧?
    • 与其放弃整个想法并使用 Collections.sort,不如考虑将 insertInOrder 作为附加方法添加到 SortedList。 List 中指定的方法将按照 List 合同的规定执行。
    【解决方案5】:

    Java SDK 没有排序的List 类。您需要的最简单的解决方案是每次添加内容时在您的List 上调用Collections.sort()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多