【发布时间】:2011-08-22 19:53:43
【问题描述】:
所以我遇到了 Guava TreeBasedTable 的问题(如果您不熟悉,它是一棵基于一对键访问其元素的树),在过去的一周里,这一直是一个难以解决的问题。我尽量解释,去掉多余的代码:
TreeBasedTable<RowValue, Data, Result> results = TreeBasedTable.create();
for (Data d : data.getData()) {
for (Operation o: data.getOperations()) {
Result r = o.calculate(...);
results.put(r.rowValue, d, r);
}
}
基本上,我会遍历我拥有的一些数据,进行一些计算,然后将结果粘贴到表格中。奇怪的是,当我尝试访问这些元素时。如果我只是按如下方式遍历它们:
for(Result r : results.values()){
System.out.println(r);
}
一切正常。但是,如果我改为尝试按如下方式访问它们:
for(RowValue row : results.rowKeySet()){
for(Data d : results.columnKeySet()){
System.out.println(results.get(row, d));
}
}
第一个元素不知何故为空。但是,如果树的大小为 1,则它可以正常工作。会不会是这里发生了一些我不理解的关于 Trees 的事情?对不起,问题很长,我希望它很清楚。
::EDIT:: 传入树的第一个值总是非空的。然而,当树达到大小 3 时,它会从非空变为空。抱歉,如果不清楚我的问题是什么。 根据要求,这是带有实际键的实际代码:
public void createResults(Options options, MeasuredData data, ArrayList methods) {
private TreeBasedTable<MethodDescriptor, Compound, Result> results = TreeBasedTable.create();
for (Compound c : data.getCompounds()) {
for (Method method : methods) {
ArrayList<Result> calcResults = method.calculate(c, options);
for (Result r : calcResults) {
results.put(r.getMethod(), c, r);
}
}
}
因此,我对多种化合物进行了多次计算,每一种都可以产生多个结果。有什么办法可以澄清一下吗?
【问题讨论】:
-
这并不是我所说的一个小而独立的例子。我的意思更像是使用
Strings 或Integer键的东西,我实际上可以运行这些键来查看您所描述的行为。也就是说,Result.getMethod()是否会返回相同的Method或通过调用method.calculate生成的每个Result不同的Method?如果相同,您需要为每个Compound/Method组合存储某种Collection<Result>值,否则您将覆盖结果。 -
是的,很抱歉。我现在怀疑 MethodDescriptor 的 compareTo 方法中发生了一些事情(有点像你刚才建议的),所以我正在解决这个问题。如果解决了,我会告诉你的。非常感谢!
-
是的,比较器搞砸了!非常感谢您的帮助!
标签: java data-structures tree guava