番石榴中的三维数据结构映射

时间:2014-04-21 11:33:29

标签: java data-structures guava

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

现在我正在使用Table中的Guava结构,如下所示:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

你的previous question已经瞄准了类似的方向。现在你需要另一个维度。并且您添加了(重要!)信息,始终为Integer值。正如我在回答你上一个问题时提到的那样,自动装箱/自动装箱可能会对此产生性能影响,但这应该仅对“大型”数据结构有意义(故意不提到“大”意味着什么)。

对于一般的“N维”索引,您可以考虑使用自己的密钥类型。特别是IntTuple之类的东西。 (事实上​​,你可以使用List<Integer>作为密钥类型,但这可能有一些缺点)。有了这样的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));

然而,注意,根据您要进行的确切查询,不同的结构可能更合适。例如,此结构允许查询

  

“给我所有的学生,'关键元组'的第二个元素的值为'x'”

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


(我在“snippets目录”中有这样一个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);
    }
}