web-dev-qa-db-ja.com

Javaコレクションの最後の要素を取得

コレクションがあり、コレクションの最後の要素を取得したい。そうするための最も簡単で速い方法は何ですか?

1つの解決策は、最初にtoArray()を実行し、次に配列の最後の要素を返すことです。他に良いものはありますか?

41
tom

非常に効率的なソリューションではありませんが、機能するソリューションです。

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;
}
8
nikolai.serdiuk

Collectionは必ずしも順序付けされた要素のセットではないため、「最後の」要素の概念がない場合があります。順序付けされたものが必要な場合は、last()メソッドを持つSortedSetを使用できます。または、Listを使用してmylist.get(mylist.size()-1);を呼び出すことができます

本当に最後の要素が必要な場合は、ListまたはSortedSetを使用する必要があります。しかし、あなたが持っているのがCollectionだけで、本当に本当にreally最後の要素が必要な場合は、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;
}
54
Jack Edmonds

Iterables.getLast Google Guavaから。 ListsとSortedSetsも最適化されています。

47
palacsint

1つの解決策は次のとおりです。

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

編集:次のように、コレクションをリストに変換する必要があります:new ArrayList(coll)

9
kukudas

基礎となるコレクションについては何も知らないが、「最後の」要素があることを知っている場合、イテレーターを使用するのが合理的な解決策です。これは常に当てはまるわけではなく、すべてのコレクションが注文されるわけではありません。

Object lastElement = null;

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

Collectionインターフェースにはlast()またはfirst()メソッドはありません。最後のメソッドを取得するには、リストでget(size() - 1)を実行するか、リストを逆にしてget(0)を実行します。 StacksまたはQueuesを扱っている場合を除き、コレクションAPIにlast()メソッドを用意する必要はありません。

2
Piyush Mattoo

または、for-eachループを使用できます。

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

上記の問題のいくつか(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です...

0
nikeros