我正在实施基于约束的大学考试调度的遗传算法。为了使约束检查有效,我需要在评估之前包含大部分信息的数据结构。
现在我正在使用Table
中的Guava
结构,如下所示:
Table<Integer, Integer, ArrayList<Student>> clashesMatrix = HashBasedTable.create();
这意味着我在二维矩阵中的考试i和考试j之间有共同的学生。但是现在我希望通过让学生参加3门考试来更进一步,即我需要一种3D matrix
。我需要这个,因为我的一个限制是为学生连续检查两到三个连续的考试,在检查约束之前获得这种数据会更有效。
Guava
中是否有可用于此目的的特定数据结构?或者有没有办法可以改变上面的表格以满足三门考试的需要?
我很感谢你的帮助,因为这是我的学位论文!谢谢:))
答案 0 :(得分:3)
你的previous question已经瞄准了类似的方向。现在你需要另一个维度。并且您添加了(重要!)信息,键始终为Integer
值。正如我在回答你上一个问题时提到的那样,自动装箱/自动装箱可能会对此产生性能影响,但这应该仅对“大型”数据结构有意义(故意不提到“大”意味着什么)。
对于一般的“N维”索引,您可以考虑使用自己的密钥类型。特别是IntTuple
之类的东西。 (事实上,你可以使用List<Integer>
作为密钥类型,但这可能有一些缺点)。有了这样的IntTuple
类,通过hashCode
和equals
的正确实现,您可以轻松定义任意的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);
}
}