【问题标题】:Collection or Array in my case?在我的情况下是集合还是数组?
【发布时间】:2012-12-11 21:38:15
【问题描述】:

我有返回 (x,y,z) 元组的 SQL 请求:

  • x 介于 1 和 9 之间
  • y 在 1 到 500 之间
  • z 介于 1 和 15 之间

所以如果我所有的 67500 种可能性都存储到数据库中,那么我有 9 * 500 * 15 = 最多 67500 种可能性和最少 0 种可能性。

例如,我的列表中可以包含 (4, 256, 1),但不能包含 (3, 410, 8)。

我想生成 3 个链表。例如,如果我选择 x=2,我希望第二个列表显示此 x 值的所有可用 y,以及带有 y 选项的 z 值的同上。

我应该使用 Collection ar Array 轻松检索值以生成 mys 列表吗?

【问题讨论】:

    标签: java arrays collections


    【解决方案1】:

    我认为当数据的大小不是恒定的(或)提前知道时,使用集合 API 总是好的。

    如果需要,您可以使用数组并执行arrayCopy,但这将是重新发明循环的东西。

    【讨论】:

    【解决方案2】:

    一般来说,只有在绝对需要时才使用数组(比如这里没有)。

    您会发现Map<Integer, List<Integer>> 是一个很好的起点。

    【讨论】:

      【解决方案3】:

      由于键落在这样的小范围内,shorts 的简单二维数组就足够了:

      short data[10][500];
      

      第一个索引是x的值;第二个索引是y 的值。

      z 的值作为short 的各个位存储在[x][y]。要访问单个位,请使用位操作:

      if ((data[x][y] & (1 << z)) != 0) // The element at x,y,x is present
          ...
      data[x][y] != (1 << z); // Add an element at x,y,z
      data[x][y] &= ~(1 << z); // Remove the element at x,y,z
      

      这种数据结构在空间上非常高效:它需要大约 10KBytes 的内存来存储整个数据集。

      【讨论】:

      • 嗯,很有意思,但我还没用过位操作,我不明白,但我会阅读这方面的教程
      • @OlivierJ。看看this article,它让你快速了解如何使用比特操作“为了乐趣和利润”。
      【解决方案4】:

      如果您的元素“列表”是不变的,您应该使用数组。通过 JDBC API 查询,您将知道查询将返回多少行。

      【讨论】:

      • 它返回元组 (1, 1, 1), (1, 1, 2), ..., (9, 500, 15) 所以我不能直接知道不同 x 的数量, y,z
      【解决方案5】:

      例如,如果我选择 x=2,我希望第二个列表显示所有 此 x 值可用 y,z 值可用 y 选择。

      如果您需要快速检索,您应该查看Map

      【讨论】:

      • 不完全是“代替”。 Map&lt;Integer,Map&lt;Integer,List&lt;Integer&gt;&gt;&gt;
      • 我想是的,但还有其他快速的方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多