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
实现是专门为稀疏数据设计的。@SashaSalauyou
ArrayTable
完全不支持行/列插入和删除,它的大小总是相同的。如果您需要插入和删除行或列,您可以您不应该使用
ArrayTable
。您是否尝试将
.newCustomTable()
LinkedHashMap
s一起使用?这应该比基于列表的方法快得多。