Использование диапазона гуавы с пользовательским объектом

1

Мне интересно, можно ли использовать диапазон Guava для перебора списка пользовательских объектов.

У меня есть этот пример, который должен получить в списке 5 элементов:

Range<CustomObject> range = Range.closed(customObjectList.get(Auxiliar.index), customObjectList.get(Auxiliar.index + 4));

И тогда я хотел бы повторить этот диапазон, чтобы получить список объектов, я имею в виду, чтобы иметь возможность сделать что-то вроде этого:

List<CustomObject> list = new ArrayList<CustomObject>();
for(CustomObject c : range){
    list.add(c)
}

На данный момент я не могу сделать это foreach на хребте Гуава, вместо этого я должен сделать это, как здесь:

for(int grade : ContiguousSet.create(yourRange, DiscreteDomain.integers())) {
  ...
}

Но здесь проблема в том, что я не могу использовать DiscreteDomain.CustomObject().

Есть ли способ использовать этот диапазон Гуава со списком CustomObject?

  • 0
    Так и должно быть, поскольку DiscreteDomain является абстрактным классом ... Однако ваш пользовательский объект, похоже, не позволит вам реализовать метод next() и previous() этого класса. Наличие кода этого класса позволит получить более подробный ответ.
Теги:
range
guava

1 ответ

4
Лучший ответ

Если вы читаете Range javadoc:

Обратите внимание, что невозможно выполнить итерацию этих содержащихся значений. Для этого передайте экземпляр этого диапазона и соответствующий DiscreteDomain для ContiguousSet.create(com.google.common.collect.Range<C>, com.google.common.collect.DiscreteDomain<C>).

Поэтому ваш подход правильный, за исключением того, что вам нужно создать пользовательский DiscreteDomain для вашего настраиваемого объекта:

public class CustomDiscreteDomain extends DiscreteDomain<CustomObject> {
  //override and implement next, previous and distance
}

Это может быть или не быть практичным в зависимости от того, что эти объекты.

Упрощенный пример с помощью LocalDate (возможно, потребуется дополнительная проверка привязки, проверка LocalDate и т.д.):

public static class LocalDateDiscreteDomain extends DiscreteDomain<LocalDate> {
  @Override public LocalDate next(LocalDate value) {
    return value.plusDays(1);
  }
  @Override public LocalDate previous(LocalDate value) {
    return value.minusDays(1);
  }
  @Override public long distance(LocalDate start, LocalDate end) {
    return DAYS.between(start, end);
  }
}
  • 0
    Спасибо за ответ, очень полезно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню