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

Ste*_*eve 3 java tree guava data-structures

所以我遇到了一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我迭代一些我拥有的数据,做一些计算,并将结果粘在表中.但奇怪的是,当我尝试访问元素时.如果我只是按如下方式迭代它们:

for(Result r : results.values()){
    System.out.println(r);
}
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,如果我尝试按如下方式访问它们:

for(RowValue row : results.rowKeySet()){
    for(Data d : results.columnKeySet()){
        System.out.println(results.get(row, d));
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个元素以某种方式为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);
           }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

Col*_*inD 5

rowKeySet()是所有行columnKeySet()的集合,是表的所有列的集合.但是,对于行键和列键的每个组合,可能不存在值.比如,也许你只计算结果具有一定RowValue的的一个Data对象.在这种情况下,该RowValue对象(行键)和任何其他Data对象(列键)的组合将不会映射到a 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));
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

根据我对null正在发生的事情的理解,没有被设置为表中的值.相反,这样的事情正在发生:

Table<Integer, Integer, String> table = TreeBasedTable.create();
table.put(1, 1, "Foo");
table.put(2, 2, "Bar");
Run Code Online (Sandbox Code Playgroud)

需要注意的是在整个表,有行12与列12.但是,11的列2和行的列只有一个值2.因此,当我们迭代遍历行和列的每个可能组合时,就像在您的示例中一样,我们打印出行1,列2和行2,列的值1,这两个null值都返回,因为没有值放在这些单元格...调用table.contains(1, 2)返回false.