1. Обзор
В этом руководстве мы покажем, как использовать интерфейс таблицы
Google Guava и его многочисленные реализации.
Таблица
Guava — это коллекция, которая представляет собой таблицу, содержащую строки, столбцы и связанные значения ячеек. Строка и столбец действуют как упорядоченная пара ключей.
2. Таблица
Гуавы Google ``
Давайте посмотрим, как использовать класс Table .
2.1. Зависимость от Maven
Начнем с добавления зависимости библиотеки Google Guava в pom.xml
:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Последнюю версию зависимости можно проверить здесь .
2.2. О
Если бы мы должны были представить таблицу
Guava с использованием коллекций
, присутствующих в ядре Java, то структура была бы картой строк, где каждая строка содержит карту столбцов со связанными значениями ячеек.
Таблица
представляет собой специальную карту, в которой два ключа могут быть указаны в комбинированном виде для ссылки на одно значение.
Это похоже на создание карты карт, например, Map<UniversityName, Map<CoursesOffered, SeatAvailable>>
. Стол
также был бы идеальным способом представления игрового поля Battleships.
3. Создание
Вы можете создать экземпляр таблицы
несколькими способами:
- Используя метод
create
из классаHashBasedTable
, который внутренне используетLinkedHashMap
:
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
- Если нам нужна
таблица
, чьи ключи строк и ключи столбцов должны быть упорядочены в соответствии с их естественным порядком или путем предоставления компараторов, вы можете создать экземпляртаблицы
, используя методcreate
из класса с именемTreeBasedTable
, который используетTreeMap
внутри:
Table<String, String, Integer> universityCourseSeatTable
= TreeBasedTable.create();
- Если мы заранее знаем ключи строки и ключи столбца и размер таблицы фиксирован, используем метод
create
из классаArrayTable
:
List<String> universityRowTable
= Lists.newArrayList("Mumbai", "Harvard");
List<String> courseColumnTables
= Lists.newArrayList("Chemical", "IT", "Electrical");
Table<String, String, Integer> universityCourseSeatTable
= ArrayTable.create(universityRowTable, courseColumnTables);
- Если мы намерены создать неизменяемый экземпляр
таблицы
, внутренние данные которой никогда не изменятся, используйте классImmutableTable
(создание которого следует шаблону компоновщика):
Table<String, String, Integer> universityCourseSeatTable
= ImmutableTable.<String, String, Integer> builder()
.put("Mumbai", "Chemical", 120).build();
4. Использование
Давайте начнем с простого примера, показывающего использование таблицы
.
4.1. Retrieval
Если мы знаем ключ строки и ключ столбца, мы можем получить значение, связанное с ключом строки и столбца:
@Test
public void givenTable_whenGet_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
int seatCount
= universityCourseSeatTable.get("Mumbai", "IT");
Integer seatCountForNoEntry
= universityCourseSeatTable.get("Oxford", "IT");
assertThat(seatCount).isEqualTo(60);
assertThat(seatCountForNoEntry).isEqualTo(null);
}
4.2. Проверка записи
Мы можем проверить наличие записи в таблице
на основе:
- Ключ строки
- Ключ столбца
- И ключ строки, и ключ столбца
- Ценность
Давайте посмотрим, как проверить наличие записи:
@Test
public void givenTable_whenContains_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
boolean entryIsPresent
= universityCourseSeatTable.contains("Mumbai", "IT");
boolean courseIsPresent
= universityCourseSeatTable.containsColumn("IT");
boolean universityIsPresent
= universityCourseSeatTable.containsRow("Mumbai");
boolean seatCountIsPresent
= universityCourseSeatTable.containsValue(60);
assertThat(entryIsPresent).isEqualTo(true);
assertThat(courseIsPresent).isEqualTo(true);
assertThat(universityIsPresent).isEqualTo(true);
assertThat(seatCountIsPresent).isEqualTo(true);
}
4.3. Удаление
Мы можем удалить запись из таблицы
, указав как ключ строки, так и ключ столбца:
@Test
public void givenTable_whenRemove_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
int seatCount
= universityCourseSeatTable.remove("Mumbai", "IT");
assertThat(seatCount).isEqualTo(60);
assertThat(universityCourseSeatTable.remove("Mumbai", "IT")).
isEqualTo(null);
}
4.4. Ключ строки к карте значения ячейки
Мы можем получить представление Map
с ключом в виде строки и значением в виде CellValue
, указав ключ столбца:
@Test
public void givenTable_whenColumn_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map<String, Integer> universitySeatMap
= universityCourseSeatTable.column("IT");
assertThat(universitySeatMap).hasSize(2);
assertThat(universitySeatMap.get("Mumbai")).isEqualTo(60);
assertThat(universitySeatMap.get("Harvard")).isEqualTo(120);
}
4.5. Картографическое представление таблицы
Мы можем получить представление Map<UniversityName, Map<CoursesOffered, SeatAvailable>>
, используя метод columnMap
:
@Test
public void givenTable_whenColumnMap_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map<String, Map<String, Integer>> courseKeyUniversitySeatMap
= universityCourseSeatTable.columnMap();
assertThat(courseKeyUniversitySeatMap).hasSize(3);
assertThat(courseKeyUniversitySeatMap.get("IT")).hasSize(2);
assertThat(courseKeyUniversitySeatMap.get("Electrical")).hasSize(1);
assertThat(courseKeyUniversitySeatMap.get("Chemical")).hasSize(1);
}
4.6. Ключ столбца к карте значения ячейки
Мы можем получить представление Map
с ключом в виде столбца и значением в виде CellValue
, указав ключ строки:
@Test
public void givenTable_whenRow_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map<String, Integer> courseSeatMap
= universityCourseSeatTable.row("Mumbai");
assertThat(courseSeatMap).hasSize(2);
assertThat(courseSeatMap.get("IT")).isEqualTo(60);
assertThat(courseSeatMap.get("Chemical")).isEqualTo(120);
}
4.7. Получить отдельный ключ строки
Мы можем получить все ключи строки из таблицы, используя метод rowKeySet
:
@Test
public void givenTable_whenRowKeySet_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set<String> universitySet = universityCourseSeatTable.rowKeySet();
assertThat(universitySet).hasSize(2);
}
4.8. Получить отдельный ключ столбца
Мы можем получить все ключи столбцов из таблицы, используя метод columnKeySet
:
@Test
public void givenTable_whenColKeySet_returnsSuccessfully() {
Table<String, String, Integer> universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set<String> courseSet = universityCourseSeatTable.columnKeySet();
assertThat(courseSet).hasSize(3);
}
5. Вывод
В этом уроке мы проиллюстрировали методы класса Table
из библиотеки Guava. Класс Table
предоставляет коллекцию, представляющую структуру, подобную таблице, содержащую строки, столбцы и связанные значения ячеек.
Код, относящийся к приведенным выше примерам, можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.