Guava Table:当高度和宽度未知且 table 稀疏时如何迭代列

Guava Table: how to iterate over columns when height and width is not known and table is sparse

我的 Java 8 代码给出了一个 Guava Table<Integer,Integer,Fizzbuzz> 的实例,其中行键和列键是非负整数 (0+),每个单元格中的值都是一个实例一些 Fizzbuzz POJO。

大多数 时间 Table 将是来自调用 HashBasedTable.create() 的散列实现,但这不一定_总是)案子。所以我(真的)需要一个适用于任何 Table 子类的解决方案。

所以我试图遍历 table 的所有行和所有列,但事先不知道有多少行或列。迄今为止我的最佳尝试:

for (Integer rowKey : myTable.rowKeySet()) {
    int colKey = 0;

    Fizzbuzz val;
    while ((val = myTable.get(rowKey, colKey)) != null) {

        // increment colKey
        colKey++;

        // do some processing with the 'val' Fizzbuzz...
    }

}

虽然效率低下而且有些不稳定,但这个 可以 工作,除了对我的 table 有效的事实 稀疏 ,意思是,并非每个单元格 value/address(行 + 列组合)都需要填充。 null 存在就好了。

我查阅了 Guava Table 文档和无数的在线示例,但我终其一生都不知道如何正确(有效地!)在行和列上设置范围 table 是稀疏的(允许空值)。 有什么想法吗?

您可以使用 rowMap() 获得 Map<R, Map<C,V>>

你可以重复这个:

table.rowMap().forEach((rowKey, row) -> {
  row.forEach((colKey, value) -> {
    // Do something for each row key/col key/value.
  });
});

(当然你可以在这里使用增强的for循环。只是在我的phone上用forEach写起来更简洁)。