【问题标题】:3D Mapping Data Structure in GuavaGuava 中的 3D 映射数据结构
【发布时间】:2014-04-21 11:33:28
【问题描述】:

我正在为基于约束的大学考试安排实施遗传算法。为了有效地进行约束检查,我需要在评估之前包含大部分信息的数据结构。

现在我正在使用来自GuavaTable 结构,如下所示:

Table<Integer, Integer, ArrayList<Student>> clashesMatrix = HashBasedTable.create();

这意味着我在二维矩阵中的考试 i 和考试 j 之间有共同的学生。但是现在我希望通过让学生在 3 次考试之间有共同点来更进一步,即我需要一种3D matrix。我需要这个,因为我的限制之一是为学生连续检查两到三个连续的考试,在检查限制之前拥有这种数据会更有效。

Guava 中是否有可用于此目的的特定数据结构?或者有什么方法可以改变上面的表格来满足三门考试的需求?

感谢您的帮助,因为这是我的学位论文!谢谢:)

【问题讨论】:

  • 您是在寻找一个更容易 的结构来使用 - 本质上是Map&lt;Integer, Map&lt;Integer, Map&lt;Integer, ArrayList&lt;Student&gt;&gt;&gt;&gt;
  • 是的@Scott 我正在寻找更容易使用的东西。我发现 Table 很容易用于 2D 结构,但在 3D 方面我还没有找到类似的东西

标签: java data-structures guava


【解决方案1】:

您的previous question 已经瞄准了类似的方向。现在你需要另一个维度。并且您添加了(重要的!)信息,即 keys 始终是 Integer 值。正如我在对您之前的问题的回答中提到的,自动装箱/自动拆箱可能会对性能产生影响,但这应该只对“大”数据结构值得注意(故意不提及“大”的确切含义)。

对于一般的“N 维”索引,您可以考虑使用自己的键类型。特别是像IntTuple 这样的东西。 (实际上,您可以使用List&lt;Integer&gt; 作为键类型,但这可能有一些缺点)。有了这样一个IntTuple 类,加上hashCodeequals 的正确实现,您可以轻松地定义任意的N 维数据结构,它可以以方便高效的形式使用:

Map<IntTuple, List<Student>> map = new HashMap<IntTuple, List<Student>>();

List<Student> students = new ArrayList<Student>();

map.put(IntTuple.of(1,2,3), students);

List<Student> s = map.get(IntTuple.of(1,2,3));

但是,请注意,根据您要进行的确切查询,不同的结构可能更合适。例如,这种结构不允许允许像

这样的查询

“给我所有‘key tuple’的第二个元素的值为‘x’的学生”

如果您需要这种查询,那么不同的数据结构可能更合适。


(我的“sn-ps 目录”中有这样一个IntTuple 类,为了方便我将其插入此处...)

import java.util.Arrays;

class IntTuple 
{
    static IntTuple of(int ... values)
    {
        return new IntTuple(values);
    }

    private final int data[];
    private IntTuple(int ... data)
    {
        this.data = data;
    }

    public int getDimensions()
    {
        return data.length;
    }

    public int get(int index)
    {
        return data[index];
    }
    @Override
    public String toString()
    {
        return Arrays.toString(data);
    }
    @Override
    public int hashCode()
    {
        return Arrays.hashCode(data);
    }
    @Override
    public boolean equals(Object object)
    {
        if (this == object)
        {
            return true;
        }
        if (object == null)
        {
            return false;
        }
        if (!(object instanceof IntTuple))
        {
            return false;
        }
        IntTuple other = (IntTuple)object;
        return Arrays.equals(data, other.data);
    }
}

【讨论】:

  • 非常感谢您的详细回答 :) 正如您所指出的,我必须首先从我的数据结构中查看我需要的确切查询,但这非常有趣,如果我没有任何具体查询,我会去的。你对你知道的其他类似的数据结构有什么建议吗?
  • @Bernice 没有特别的。我已经在对另一个问题的回答中指出,从 Guava 表中获取 eitheror 列的可能性可能是一个简洁的功能,但特别是对于更高维度,事情可能会变得棘手:然后查询可能会引用具有任意维度的“切片”(或“子空间”)。例如。 1D:“给我所有坐标为 (3,4,x) 的任意 x 的元素”,或 2D:“给我所有坐标为 (3,y,x) 的任意 x 和 y 的元素”等等。这真的取决于你想用这个数据结构做什么
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多