树中的第一个元素变为空?番石榴树基地

时间:2011-08-22 19:53:43

标签: java data-structures tree guava

所以我遇到了一个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);
           }
     }
}

因此,我对许多化合物进行了大量计算,每个化合物都可以产生多种结果。有什么方法可以澄清这个吗?

1 个答案:

答案 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以及12列。但是,行1的第1列和行2的第2列只有一个值。因此,当我们迭代遍历行和列的每个可能组合时,就像在示例中一样,我们打印出行1,列2和行2,列{的值{1}},两者都返回1,因为这些单元格没有放置任何值...调用null会返回table.contains(1, 2)