是否存在非冗长的方式(例如使用来自现有库的方法调用,无论是番石榴还是类似方法)从Iterable中检索前一个和后一个元素,给定其中一个元素?
我想有一个适合Iterable(或者如果它足够酷的Collection)的通用解决方案,所以请不要发布仅适用于Set或List等的解决方案(也许添加注释:))。
我需要其中一个,我不想在一个方法中找到上一个和后一个元素。
我的解决方案如下。如果您想评论返回null而不是抛出IllegalArgumentException或类似的东西,请随意这样做。 getElementBefore()方法创建了一个新列表,我也不满意。
public static <C> C getElementAfter(final C element, final Iterable<C> iterable) {
Iterator<C> iterator = iterable.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals(element)) {
if (iterator.hasNext()) {
return iterator.next();
} else {
return null;
}
}
}
throw new IllegalArgumentException("Iterable does not contain element.");
}
public static <C> C getElementBefore(final C element, final Iterable<C> iterable) {
return getElementAfter(element, Lists.reverse(Lists.newArrayList(iterable)));
}
答案 0 :(得分:1)
在这种情况下返回null可能更有意义,因为它可能不是例外。
您的getElementBefore实施可以改进:
public static <C> C getElementBefore(final C element, final Iterable<C> iterable) {
C previous = null;
while (iterator.hasNext()) {
C current = iterator.next();
if (current.equals(element)) {
return previous;
} else {
previous = current;
}
}
return null;
}
答案 1 :(得分:0)
我会做这样的事情:
Iterator<C> iterator = iterable.iterator();
C before = null;
C after = null;
while (iterator.hasNext()) {
C current = iterator.next();
if (current.equals(element)) {
if (iterator.hasNext()) {
after = iterator.next();
}
break;
}
before = current;
}
这应该保存before
之前的元素和after
之后的元素。