【问题标题】:Sorted Data Structure with index retrieval带索引检索的排序数据结构
【发布时间】:2021-05-21 04:43:11
【问题描述】:

哪个Collection按指定的顺序存储数据,并且可以根据索引返回或设置元素?我知道 TreeSet 实现了 SortedSet,因此根据自然顺序或程序员提供的某些 Comparator 对象存储数据。但我不知道如何使用索引检索或设置 TreeSet 中的元素。另一方面,ArrayList 和其他一些结构可用于根据任何索引检索或设置其元素。但它们不会按排序顺序存储元素。有什么方法可以同时拥有这两个功能?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    您可以只使用ArrayList 并使用Collections.sort 对其进行排序。如果您必须插入元素,您可以使用Collections.binarySearch 找到插入点,从而为您提供 O(log n) 的插入复杂度(而不是 O(n log n) 的重新排序)。 ArrayList 提供overload of add that takes a position parameter

    【讨论】:

    • 我必须添加元素太多次。所以每次我都必须调用 sort() 因为我需要始终对结构进行排序而不会失败。没问题吧?
    • 您不必求助。如果您使用二分搜索找到正确的插入点,您可以插入您的项目,以便它们始终处于正确的顺序。这将为您提供与TreeSet 相同的复杂性。
    • 插入到 ArrayList 的中间会导致复制元素,所以它不是 O(log n) 操作。考虑 LinkedList。
    【解决方案2】:

    将元素填充到 ArrayList 并通过调用对其进行排序 集合.sort()。

    【讨论】:

    • 我必须添加元素太多次。所以每次我都必须调用 sort() 因为我需要始终对结构进行排序而不会失败。
    • 你能扩展 ArrayList 并创建你自己的数据结构吗?
    【解决方案3】:

    看看 indexed-tree-map https://github.com/geniot/indexed-tree-map 我增强了 TreeMap 以提供按索引的访问和检索。 要获取不存在的键的插入索引,您可以尝试运行 put-entryIndex-remove 序列。尽管它对于您的要求可能不是很有效。我的 entryIndex 实现是基于首先找到条目然后计算其索引。我会看看是否可以对不存在的键进行改进。

    如果不意外破坏排序顺序,您不能在排序集中按索引设置元素。如果您的意思是“通过键的索引设置地图的值”,那么您可以再次使用 index-tree-map。只需通过索引找到键并使用 put 覆盖值。

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2021-03-23
      • 1970-01-01
      • 2012-02-18
      • 2014-09-10
      相关资源
      最近更新 更多