Руководство по таблице гуавы
1. обзор
В этом руководстве мы покажем, как использовать интерфейсTable Google Guava и его различные реализации.
Table Guava - это коллекция, которая представляет собой структуру, подобную таблице, содержащую строки, столбцы и соответствующие значения ячеек. Строка и столбец действуют как упорядоченная пара ключей.
2. Table в Google Guava
Давайте посмотрим, как использовать классTable.
2.1. Maven Dependency
Начнем с добавления зависимости библиотеки Google Guava вpom.xml:
com.google.guava
guava
21.0
Последнюю версию зависимости можно проверитьhere.
2.2. Около
Если бы мы должны были представитьTable Guava с использованиемCollections, присутствующего в ядре Java, тогда структура была бы картой строк, где каждая строка содержит карту столбцов со связанными значениями ячеек.
Table представляет собой специальную карту, в которой два ключа могут быть указаны вместе, чтобы ссылаться на одно значение.
Это похоже на создание карты карт, напримерMap<UniversityName, Map<CoursesOffered, SeatAvailable>>. Table также был бы прекрасным способом представления игрового поля «Морской бой».
3. Создание
Вы можете создать экземплярTable несколькими способами:
-
Используя методcreate из классаHashBasedTable, который внутренне используетLinkedHashMap:
Table
universityCourseSeatTable = HashBasedTable.create(); -
Если нам нуженTable, ключи строк и ключи столбцов которого должны быть упорядочены по их естественному порядку или путем предоставления компараторов, вы можете создать экземплярTable, используя методcreate из класс с именемTreeBasedTable, который внутренне используетTreeMap:
Table
universityCourseSeatTable = TreeBasedTable.create(); -
Если мы заранее знаем ключи строки и ключи столбца и размер таблицы фиксирован, используйте методcreate из классаArrayTable:
List
universityRowTable = Lists.newArrayList("Mumbai", "Harvard"); List courseColumnTables = Lists.newArrayList("Chemical", "IT", "Electrical"); Table universityCourseSeatTable = ArrayTable.create(universityRowTable, courseColumnTables); -
Если мы намерены создать неизменяемый экземплярTable, чьи внутренние данные никогда не изменятся, используйте классImmutableTable (создание которого следует шаблону построителя):
Table
universityCourseSeatTable = ImmutableTable. builder() .put("Mumbai", "Chemical", 120).build();
4. С помощью
Начнем с простого примера, показывающего использованиеTable.
4.1. поиск
Если мы знаем ключ строки и ключ столбца, мы можем получить значение, связанное со строкой и ключом столбца:
@Test
public void givenTable_whenGet_returnsSuccessfully() {
Table 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. Проверка на въезд
Мы можем проверить наличие записи вTable на основе:
-
Ключ строки
-
Ключ столбца
-
Ключ строки и ключ столбца
-
Значение
Давайте посмотрим, как проверить наличие записи:
@Test
public void givenTable_whenContains_returnsSuccessfully() {
Table 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. Удаление
Мы можем удалить запись изTable, указав как ключ строки, так и ключ столбца:
@Test
public void givenTable_whenRemove_returnsSuccessfully() {
Table 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 universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map universitySeatMap
= universityCourseSeatTable.column("IT");
assertThat(universitySeatMap).hasSize(2);
assertThat(universitySeatMap.get("Mumbai")).isEqualTo(60);
assertThat(universitySeatMap.get("Harvard")).isEqualTo(120);
}
4.5. Отображение картыTable
Мы можем получить представлениеMap<UniversityName, Map<CoursesOffered, SeatAvailable>>, используя методcolumnMap:
@Test
public void givenTable_whenColumnMap_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map> 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 universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Map 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 universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set universitySet = universityCourseSeatTable.rowKeySet();
assertThat(universitySet).hasSize(2);
}
4.8. Получить отчетливый ключ столбца
Мы можем получить все ключи столбцов из таблицы, используя методcolumnKeySet:
@Test
public void givenTable_whenColKeySet_returnsSuccessfully() {
Table universityCourseSeatTable
= HashBasedTable.create();
universityCourseSeatTable.put("Mumbai", "Chemical", 120);
universityCourseSeatTable.put("Mumbai", "IT", 60);
universityCourseSeatTable.put("Harvard", "Electrical", 60);
universityCourseSeatTable.put("Harvard", "IT", 120);
Set courseSet = universityCourseSeatTable.columnKeySet();
assertThat(courseSet).hasSize(3);
}
5. Заключение
В этом руководстве мы проиллюстрировали методы классаTable из библиотеки Guava. КлассTable предоставляет коллекцию, которая представляет собой структуру, подобную таблице, содержащую строки, столбцы и связанные значения ячеек.
Код, принадлежащий приведенным выше примерам, можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.