2011-12-02 3613 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; 
相關問題