1. Обзор
В этом уроке мы покажем, как использовать интерфейс Range Set Google Guava и его реализации.
Набор диапазонов -это набор, состоящий из нуля или более непустых, несвязанных диапазонов. При добавлении диапазона в изменяемый набор диапазонов все подключенные диапазоны объединяются вместе , а пустые диапазоны игнорируются.
Базовая реализация Range Set – это TreeRangeSet .
2. Набор диапазонов Google Guava
Давайте посмотрим, как использовать класс Range Set .
2.1. Зависимость Maven
Давайте начнем с добавления зависимости библиотеки Guava от Google в pom.xml :
com.google.guava guava 29.0-jre
Последнюю версию зависимости можно проверить здесь .
3. Создание
Давайте рассмотрим некоторые из способов, с помощью которых мы можем создать экземпляр набора диапазонов .
Во-первых, мы можем использовать метод create из класса TreeRangeSet для создания изменяемого набора:
RangeSetnumberRangeSet = TreeRangeSet.create();
Если у нас уже есть коллекции, используйте метод create из класса TreeRangeSet , чтобы создать изменяемый набор, передав эту коллекцию:
List> numberList = Arrays.asList(Range.closed(0, 2)); RangeSet numberRangeSet = TreeRangeSet.create(numberList);
Наконец, если нам нужно создать immutablerangeset, используйте класс ImmutableRangeSet (создание которого следует шаблону компоновщика):
RangeSetnumberRangeSet = new ImmutableRangeSet. builder().add(Range.closed(0, 2)).build();
4. Использование
Давайте начнем с простого примера, который показывает использование Набора диапазонов .
4.1. Добавление в диапазон
Мы можем проверить, находится ли поставляемый вход в пределах диапазона, присутствующего в любом из элементов диапазона в наборе:
@Test public void givenRangeSet_whenQueryWithinRange_returnsSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 5)); numberRangeSet.add(Range.closed(6, 8)); assertTrue(numberRangeSet.contains(1)); assertFalse(numberRangeSet.contains(9)); }
Записи:
- Метод closed класса Range предполагает, что диапазон целочисленных значений составляет от 0 до 2 (оба включительно)
- Диапазон в приведенном выше примере состоит из целых чисел. Мы можем использовать диапазон, состоящий из любого типа , если он реализует Сопоставимый интерфейс, такой как Строка , Символ , десятичные дроби с плавающей запятой и т. Д
- В случае ImmutableRangeSet элемент диапазона , присутствующий в наборе, не может перекрываться с элементом диапазона, который хотелось бы добавить. Если это произойдет, мы получим исключение IllegalArgumentException
- Диапазон, вводимый в Набор диапазонов , не может быть равен нулю. Если входные данные null , мы получим исключение NullPointerException
4.2. Удаление диапазона
Давайте посмотрим, как мы можем удалить значения из набора диапазонов |:
@Test public void givenRangeSet_whenRemoveRangeIsCalled_removesSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 5)); numberRangeSet.add(Range.closed(6, 8)); numberRangeSet.add(Range.closed(9, 15)); numberRangeSet.remove(Range.closed(3, 5)); numberRangeSet.remove(Range.closed(7, 10)); assertTrue(numberRangeSet.contains(1)); assertFalse(numberRangeSet.contains(9)); assertTrue(numberRangeSet.contains(12)); }
Как видно, после удаления мы все еще можем получить доступ к значениям, присутствующим в любом из элементов диапазона, оставшихся в наборе.
4.3. Диапазон измерения
Теперь давайте посмотрим, каков общий диапазон набора диапазона :
@Test public void givenRangeSet_whenSpanIsCalled_returnsSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 5)); numberRangeSet.add(Range.closed(6, 8)); Range experienceSpan = numberRangeSet.span(); assertEquals(0, experienceSpan.lowerEndpoint().intValue()); assertEquals(8, experienceSpan.upperEndpoint().intValue()); }
4.4. Получение поддиапазона
Если мы хотим получить часть набора диапазона на основе заданного диапазона , мы можем использовать метод subRangeSet :
@Test public void givenRangeSet_whenSubRangeSetIsCalled_returnsSubRangeSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 5)); numberRangeSet.add(Range.closed(6, 8)); RangeSet numberSubRangeSet = numberRangeSet.subRangeSet(Range.closed(4, 14)); assertFalse(numberSubRangeSet.contains(3)); assertFalse(numberSubRangeSet.contains(14)); assertTrue(numberSubRangeSet.contains(7)); }
4.5. Метод дополнения
Далее, давайте получим все значения , кроме одного, присутствующего в Наборе диапазонов , используя метод complement :
@Test public void givenRangeSet_whenComplementIsCalled_returnsSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 5)); numberRangeSet.add(Range.closed(6, 8)); RangeSet numberRangeComplementSet = numberRangeSet.complement(); assertTrue(numberRangeComplementSet.contains(-1000)); assertFalse(numberRangeComplementSet.contains(2)); assertFalse(numberRangeComplementSet.contains(3)); assertTrue(numberRangeComplementSet.contains(1000)); }
4.6. Пересечение С Диапазоном
Наконец, когда мы хотим проверить, пересекается ли интервал диапазона, присутствующий в наборе диапазона , с некоторыми или всеми значениями в другом заданном диапазоне, мы можем использовать метод intersect :
@Test public void givenRangeSet_whenIntersectsWithinRange_returnsSucessfully() { RangeSetnumberRangeSet = TreeRangeSet.create(); numberRangeSet.add(Range.closed(0, 2)); numberRangeSet.add(Range.closed(3, 10)); numberRangeSet.add(Range.closed(15, 18)); assertTrue(numberRangeSet.intersects(Range.closed(4, 17))); assertFalse(numberRangeSet.intersects(Range.closed(19, 200))); }
5. Заключение
В этом уроке мы проиллюстрировали набор диапазонов библиотеки Guava на нескольких примерах. Набор Range в основном используется для проверки того, попадает ли значение в определенный диапазон, присутствующий в наборе.
Реализацию этих примеров можно найти в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.