有序表数据结构

时间:2015-05-12 13:50:41

标签: java data-structures guava

我有以表格形式构建的数据

+------+------+------+------+
|      | Col1 | Col2 | Col3 |
+------+------+------+------+
| Row1 |    1 |    2 |    3 |
| Row2 |    5 |    5 |    6 |
| Row3 |    9 |    2 |    7 |
+------+------+------+------+

我正在寻找一种允许以下内容的数据结构:

  • 快速迭代列和行(获取列或行的值。(在一个方向上迭代而不是在另一个方向上迭代不应该更昂贵)
  • 快速添加和删除整个行和列(同样两个操作应该同样快,最多应为O(n))
  • 基于广告订单和可重新订购的订单。订单将使用一些比较器计算,通常取决于行或列中的数据,但不取决于任何名称或此类
  • 存储数字以外的数据(我们有混合数据,但我打算使用容器类来获取实际数据)

此外,行和列将包含元数据(名称,颜色和类似的东西)。所有这些操作经常发生在我们的系统中。目前我们存储基于数据的行,并且列没有引用与它们相关的数据。这使得删除列或迭代其数据非常繁琐。

我想到的第一件事就是Guava Table,但这不是有序的,我不确定删除整行或列是否容易,尽管清除行或列映射可能会它

由于需要添加和删除,因此阵列作为后备存储将无法正常工作。 (虽然我可以预测表的大小并为删除创建新表,但我不喜欢该解决方案,即使它可能对用户隐藏)

对于如何实现这种数据结构的任何想法,我将不胜感激。

为了澄清,我不需要一个完成这个的完成的库,但我正在寻找一个允许我创建它的数据结构。我已经知道我将把行和列元数据存储在单独的列表中,例如

2 个答案:

答案 0 :(得分:3)

当然可以订购番石榴 <p> <strong>Synopsis <br /> <span style="color:#FF0000;">No special characters like <strong>&#39;</strong> or <strong>&quot;</strong> in synopsis!</span> </p> <form> <textarea name="synopsis" id="editor1" rows="10" cols="80"> <?php echo ''.$fetch['synopsis'].'';?> </textarea> <script> CKEDITOR.replace( 'editor1' ); </script> </form> ImmutableTable提供“可靠的用户指定的迭代顺序”和(来自Builder docs)“默认情况下,单元格添加到构建器的顺序决定了返回表格中所有视图的迭代顺序”

如果您需要Table可变并想要TreeBasedTable,则可以使用RowSortedTable

你也可以很容易地实现自己的Table课程。使用ForwardingTableLinkedHashBasedTable来存储您所需的迭代顺序,或者只需使用LinkedHashSet作为第一个参数调用Tables.newCustomTable()(以及{{1}的结果},如果需要的话。)

大多数LinkedHashMap实现为所有标准方法提供O(1)或O(n)(其中n是行/列计数)实现,以及返回视图的方法(如SupplierTable)由原始row()直接支持,因此效率相同。

如果您真的担心所有可用的colum()实施(包括Table)太慢,您应该对此进行基准测试。它们对于所有正常使用都足够有效,并且没有证明Table是您的瓶颈,创建自己的数据结构是premature optimization的明确实例。

答案 1 :(得分:0)

谢谢大家的帮助和想法。我得出的结论是,我将保持表的当前结构,其中包含每个都有单元格列表的行列表。虽然这使得迭代列或删除列很困难,但我们的表通常很小(<15行,<100列),我们当前实现的主要瓶颈是数据存储在字符串中而不是键入(如果经常这么做,Double.parse会非常昂贵)。虽然开发一个满足我原始问题所有要求的数据结构会非常有趣,但实际情况是我不能花那么多时间来处理这个问题。