Java:在Iterable中获取给定元素之前或之后的元素

时间:2013-12-06 11:42:38

标签: java collections iterator

是否存在非冗长的方式(例如使用来自现有库的方法调用,无论是番石榴还是类似方法)从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)));
}

2 个答案:

答案 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之后的元素。