Guava Table: как перебирать столбцы, когда высота и ширина неизвестны, а таблица разрежена - PullRequest
0 голосов
/ 23 апреля 2020

Мой Java 8 код дает экземпляр Guava Table<Integer,Integer,Fizzbuzz>, где ключи строки и столбца являются неотрицательными целыми числами (0+), а значения в каждой ячейке являются экземпляром некоторого Fizzbuzz POJO .

Большую часть времени Table будет хэшированной реализацией, которая возникает при вызове HashBasedTable.create(), однако это не всегда _ всегда). Поэтому мне (действительно) нужно решение, которое работает для любого подкласса 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...
    }

}

Несмотря на свою неэффективность и несколько вялость, эта будет работать, за исключением того факта, что для моей таблицы допустимо значение разреженное Это означает, что не каждое значение / адрес ячейки (строка + столбец) должно быть заполнено. Это нормально для null с.

Я поливал документы по таблице Guava Table и бесчисленные онлайн-примеры, и я не могу понять, как правильно (и эффективно!) Выбирать диапазон. по строкам и столбцам, когда таблица разрежена (допускает нулевые значения). Есть идеи?

1 Ответ

2 голосов
/ 23 апреля 2020

Вы можете использовать rowMap(), чтобы получить Map<R, Map<C,V>>.

. Вы можете повторить это:

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

(Из c вы можете использовать улучшено для циклов здесь. Просто более кратко написать с помощью forEach на моем телефоне).

...