Java 有序表数据结构
我将数据结构化为表格形式Java 有序表数据结构,java,data-structures,guava,Java,Data Structures,Guava,我将数据结构化为表格形式 +------+------+------+------+ | | Col1 | Col2 | Col3 | +------+------+------+------+ | Row1 | 1 | 2 | 3 | | Row2 | 5 | 5 | 6 | | Row3 | 9 | 2 | 7 | +------+------+------+------+ 我正在寻找一种允许以下内容的数据结构: 列和行的快
+------+------+------+------+
| | Col1 | Col2 | Col3 |
+------+------+------+------+
| Row1 | 1 | 2 | 3 |
| Row2 | 5 | 5 | 6 |
| Row3 | 9 | 2 | 7 |
+------+------+------+------+
我正在寻找一种允许以下内容的数据结构:
- 列和行的快速迭代(获取列或行的值。(在一个方向上迭代不会比在另一个方向上迭代更昂贵)
- 快速添加和删除整行和整列(同样,这两个操作的速度应该相同,最多为O(n))
- 基于插入顺序和可重排序的顺序。顺序将使用一些比较器计算,通常取决于行或列中的数据,但不取决于任何名称等
- 存储数字以外的数据(我们有混合数据,但我计划使用容器类来存储实际数据)
为了澄清这一点,我不需要一个完成的库,但我正在寻找一个数据结构,允许我创建这个库。我已经知道,我将在单独的列表中存储行和列元数据,例如Guava
Table
s肯定可以排序。提供“可靠的用户指定迭代顺序”和(来自文档)“默认情况下,单元格添加到生成器的顺序决定了返回表中所有视图的迭代顺序”
如果您需要一个可变的表
,并且需要一个
您还可以非常轻松地实现自己的LinkedHashBasedTable
类。可以使用和LinkedHashSet
来存储所需的迭代顺序,也可以使用LinkedHashMap
作为第一个参数(以及供应商的结果,如果需要的话)
大多数Table
实现为所有标准方法提供O(1)或O(n)(其中n是行/列数)实现,返回视图的方法(如row()
和column()
)直接由原始Table
支持,因此它们同样有效
如果您真的担心所有可用的表
实现(包括.newCustomTable()
)如果速度太慢,您应该对此进行基准测试。对于所有正常使用,它们都足够高效,而且没有证据表明表是您的瓶颈创建您自己的数据结构就是一个明显的例子。感谢大家的帮助和想法。我得出结论,我将保留表的当前结构列出一个行列表,每个行都有一个单元格列表。虽然这使得遍历列或删除列很困难,但我们的表通常很小(<15行,请澄清在您的情况下“排序”是什么?另一个问题:您需要通过索引进行O(1)访问还是O(k)可以(k-列/行数)?通过索引进行访问O(k)没关系,我们不经常这样做(从技术上讲,我们这样做是因为我们不能迭代列,但这是我想改变的)。排序通常是按插入顺序进行的,尽管最后我们通常按行或列和排序(结果最多的行在顶部,列在左侧)如果是这样的话,我建议一种基于4个链接节点(上、下、左、右)的结构,它可以在任何方向上轻松迭代,添加/删除也不会超过O(k)。我开始编写代码作为答案,但知道有些情况需要测试和调试,因此被丢弃。我想我稍后会返回。如果您找到一些现成的解决方案,请在此处进行评论。我已经想到了4-链表,但我将其放在backburner上,因为它的实现非常复杂。您不需要花费时间但是,它正在编写代码。阅读javadoc,但仍然不知道如何使用它实现快速列删除…@SashaSalauyou最干净的方法可能是使用Table.column(column).clear()
-这是O(n)(其中n是行计数),因为它必须在行映射上迭代。我想这是用于清除的(将空值或伪值设置为整列),不删除。在多次插入/删除后,该表将变得稀疏。(我不打算批评,只是发现可能性)@SashaSalauyou“在多次插入/删除后,该表将变得非常稀疏。”我不完全清楚您的意思,但是除了ArrayTable
之外的Table
实现是专门为稀疏数据设计的。@SashaSalauyouArrayTable
完全不支持行/列插入和删除,它的大小总是相同的。如果您需要插入和删除行或列,您可以您不应该使用ArrayTable
。您是否尝试将.newCustomTable()
与LinkedHashMap
s一起使用?这应该比基于列表的方法快得多。