将Guava Range与自定义对象一起使用

Ale*_*xDG 1 java range guava

我想知道是否可以使用Guava Range对自定义对象列表进行迭代。

我有这个示例,它应该在列表中获得5个项目的间隔:

Range<CustomObject> range = Range.closed(customObjectList.get(Auxiliar.index), customObjectList.get(Auxiliar.index + 4));
Run Code Online (Sandbox Code Playgroud)

然后,我想遍历此范围以获得我的对象列表,以便能够执行以下操作:

List<CustomObject> list = new ArrayList<CustomObject>();
for(CustomObject c : range){
    list.add(c)
}
Run Code Online (Sandbox Code Playgroud)

目前,我不能做一个番石榴范围本的foreach,而不是我要做的,像这里

for(int grade : ContiguousSet.create(yourRange, DiscreteDomain.integers())) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

但是这里的问题是,我不能使用DiscreteDomain.CustomObject()。

有没有办法将此Guava Range与CustomObject列表一起使用?

ass*_*ias 5

如果您阅读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
}
Run Code Online (Sandbox Code Playgroud)

取决于那些对象是什么,这可能可行,也可能不可行。

具有的简单示例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);
  }
}
Run Code Online (Sandbox Code Playgroud)