Рубрики
Без рубрики

Руководство по набору ассортимента Гуавы

Узнайте, как использовать набор диапазонов Google Guava и его реализации на практических примерах.

Автор оригинала: baeldung.

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 для создания изменяемого набора:

RangeSet numberRangeSet = TreeRangeSet.create();

Если у нас уже есть коллекции, используйте метод create из класса TreeRangeSet , чтобы создать изменяемый набор, передав эту коллекцию:

List> numberList = Arrays.asList(Range.closed(0, 2));
RangeSet numberRangeSet = TreeRangeSet.create(numberList);

Наконец, если нам нужно создать immutablerangeset, используйте класс ImmutableRangeSet (создание которого следует шаблону компоновщика):

RangeSet numberRangeSet 
  = new ImmutableRangeSet.builder().add(Range.closed(0, 2)).build();

4. Использование

Давайте начнем с простого примера, который показывает использование Набора диапазонов .

4.1. Добавление в диапазон

Мы можем проверить, находится ли поставляемый вход в пределах диапазона, присутствующего в любом из элементов диапазона в наборе:

@Test
public void givenRangeSet_whenQueryWithinRange_returnsSucessfully() {
    RangeSet numberRangeSet = 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() {
    RangeSet numberRangeSet = 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() {
    RangeSet numberRangeSet = 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() {
  
    RangeSet numberRangeSet = 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() {
    RangeSet numberRangeSet = 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() {
    RangeSet numberRangeSet = 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, поэтому его должно быть легко импортировать и запускать как есть.