Java获取集合的最后一个元素

时间:2011-12-02 18:18:54

标签: java collections iterator

我有一个集合,我想获得该集合的最后一个元素。这样做最直接,最快速的方法是什么?

一种解决方案是首先使用toArray(),然后返回数组的最后一个元素。还有其他更好的吗?

10 个答案:

答案 0 :(得分:53)

Collection不一定是有序的元素集,因此可能没有“last”元素的概念。如果您想要订购的商品,可以使用SortedSet方法last()。或者您可以使用List并致电mylist.get(mylist.size()-1);

如果确实需要最后一个元素,则应使用ListSortedSet。但是,如果你拥有的只是一个Collection并且你真的,真的需要最后一个元素,你可以使用toArray()或者你可以使用Iterator和迭代到列表的末尾。

例如:

public Object getLastElement(final Collection c) {
    final Iterator itr = c.iterator();
    Object lastElement = itr.next();
    while(itr.hasNext()) {
        lastElement = itr.next();
    }
    return lastElement;
}

答案 1 :(得分:44)

来自Google Guava的

Iterables.getLast。 它也对ListSortedSet进行了一些优化。

答案 2 :(得分:9)

一个解决方案可能是:

list.get(list.size()-1)

编辑:您必须将集合转换为列表之前可能是这样的:new ArrayList(coll)

答案 3 :(得分:6)

这不是一个非常有效的解决方案,但是工作一个:

public static <T> T getFirstElement(final Iterable<T> elements) {
    return elements.iterator().next();
}

public static <T> T getLastElement(final Iterable<T> elements) {
    T lastElement = null;

    for (T element : elements) {
        lastElement = element;
    }

    return lastElement;
}

答案 4 :(得分:3)

如果您对底层Collection一无所知,那么合理的解决方案是使用迭代器,但确实知道有一个“last”元素。情况并非总是如此,并非所有集合都是订购的。

Object lastElement = null;

for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
  lastElement = collectionItr.next();
}

答案 5 :(得分:2)

Collection接口中没有last()first()方法。要获取最后一个方法,您可以在列表上执行get(size() - 1)或反转列表并执行get(0)。除非您正在处理last()Stacks

,否则我认为不需要在任何Collection API中使用Queues方法

答案 6 :(得分:0)

或者你可以使用for-each循环:

Collection<X> items = ...;
X last = null;
for (X x : items) last = x;

答案 7 :(得分:0)

为避免上面提到的一些问题(对于null等而言不健壮),为了获取列表中的第一个和最后一个元素,可以采用一种方法

import java.util.List;

public static final <A> A getLastElement(List<A> list) {
    return list != null ? getElement(list, list.size() - 1) : null;
}

public static final <A> A getFirstElement(List<A> list) {
    return list != null ? getElement(list, 0) : null;
}   

private static final <A> A getElement(List<A> list, int pointer) {
    A res = null;
    if (list.size() > 0) {
        res = list.get(pointer);            
    }
    return res;
}

采用的惯例是,空列表的第一个/最后一个元素为null ...

答案 8 :(得分:0)

这应该可以正常工作,而无需转换为列表/数组:

collectionName.stream().reduce((prev, next) -> next).orElse(null)

答案 9 :(得分:0)

如果您有Iterable转换为流并找到最后一个元素

 Iterator<String> sourceIterator = Arrays.asList("one", "two", "three").iterator();

 Iterable<String> iterable = () -> sourceIterator;


 String last = StreamSupport.stream(iterable.spliterator(), false).reduce((first, second) -> second).orElse(null);