2011-12-02 43 views
35

我有一个集合,我想获取集合的最后一个元素。最直接和最快捷的方式是什么?Java获取集合的最后一个元素

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

回答

3

这不是很有效的解决方案,但工作之一:

public static <T> T getFirstElement(final Iterable<T> elements) { 
     if (elements == null) 
      return null; 

     return elements.iterator().next(); 
    } 

    public static <T> T getLastElement(final Iterable<T> elements) { 
     final Iterator<T> itr = elements.iterator(); 
     T lastElement = itr.next(); 

     while(itr.hasNext()) { 
      lastElement=itr.next(); 
     } 

     return lastElement; 
    } 
6

好一个解决办法是:

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

编辑:您以前也许这样对集合转换到一个列表:新的ArrayList(科尔)

+0

所以我需要先用收集来构建列表。性能明智,这将不同于toArray解决方案吗? – tom

+0

如果您所做的只是获取最后一个元素,那么使用toArray()比构建ArrayList效率更高 – mwk

+0

问题提到它是一个集合而不是列表。现在,将它转换为列表只是为了让最后一个元素是一个不好的解决方案,并且如果您有大量集合,可能会导致性能瓶颈。改用Guava的Iterable.getLast方法。 – javadev

3

一个合理的解决办法是使用迭代器,如果你不知道底层集合的任何内容,但知道有一个“最后一个”元素。情况并非总是如此,并非所有的收藏品都是订购的。

Object lastElement = null; 

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

正确,我不知道集合的基础类型。但是,如果它是一个大集合,那么它将是一个O(N)解决方案。我基本上正在寻找一个O(1)解决方案。 – tom

+0

这是不可能的。考虑尝试获取单链表的最后一个元素。该操作*具有*为O(n),没有通用的O(1)答案。 –

48

Collection不是一定元素的有序集合,从而有可能无法“最后一个”元件的概念。如果您想要订购某些东西,则可以使用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; 
} 
+0

我只有可用的集合,我不知道它的基本类型是数组,列表还是其他。因此,要使用SortedSet,我必须首先使用集合构造SortedSet,然后完成剩下的工作。这会很贵吗? – tom

+0

@tom它可能是O(n * lg(n))来构造'SortedSet'(如果你一次构建它)。所以取决于你期望拥有多少物品,这可能会相当昂贵。通常,如果你的基础类型是有序的,即使你不知道它是什么类型的List,你至少可以将它转换成List。 –

+0

谢谢@Jack,假设我的数据在返回给我时被排序,因为他们是这样的,会不会有另一种解决方案? – tom

2

没有在Collection接口一个last()first()方法。为了获得最后一种方法,您可以在列表上执行get(size() - 1)或反转列表并执行get(0)。我没有看到需要在任何收集API中使用last()方法,除非您正在处理来自Google Guava的StacksQueues

+0

集合也没有get方法。 – tom

+0

当然!我的意思是Collection接口的List实现。 –

0

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

Collection<X> items = ...; 
X last = null; 
for (X x : items) last = x; 
相关问题