所以我遇到了一个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));
}
}
第一个元素以某种方式为null。但是,如果树的大小为1,则可以正常工作。可能是树木有什么东西在这里,我不理解?很抱歉这个问题很长,我希望很清楚。
:: EDIT ::传递给树的第一个值始终为非null。但是当树到达大小3时,它将从非null变为null。对不起,如果不清楚我的问题是什么。 根据要求,这是实际密码的实际代码:
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);
}
}
}
因此,我对许多化合物进行了大量计算,每个化合物都可以产生多种结果。有什么方法可以澄清这个吗?
答案 0 :(得分:5)
rowKeySet()
是所有行的集合,columnKeySet()
是表的所有列的集合。但是,对于行键和列键的每个组合,可能不存在值。例如,您可能只为RowValue
个对象之一计算了某个Data
的结果。在这种情况下,RowValue
对象(行键)和任何其他Data
对象(列键)的组合不会映射到Result
。你可能会看到这样的事情。
要仅迭代有效映射,您需要执行以下操作:
for (RowValue row : results.rowKeySet()) {
// Only iterate over the columns that actually have values for this row
for (Data d : results.row(row).keySet()) {
System.out.println(results.get(row, d));
}
}
修改强>
根据我对正在发生的事情的理解,没有null
被设置为表中的值。相反,这样的事情正在发生:
Table<Integer, Integer, String> table = TreeBasedTable.create();
table.put(1, 1, "Foo");
table.put(2, 2, "Bar");
请注意,在整个表格中,有1
行和2
以及1
和2
列。但是,行1
的第1
列和行2
的第2
列只有一个值。因此,当我们迭代遍历行和列的每个可能组合时,就像在示例中一样,我们打印出行1
,列2
和行2
,列{的值{1}},两者都返回1
,因为这些单元格没有放置任何值...调用null
会返回table.contains(1, 2)
。