Java получить последний элемент коллекции - PullRequest
41 голосов
/ 02 декабря 2011

У меня есть коллекция, я хочу получить последний элемент коллекции. Какой самый простой и быстрый способ сделать это?

Одним из решений является сначала toArray (), а затем вернуть последний элемент массива. Есть ли еще лучшие?

Ответы [ 8 ]

54 голосов
/ 02 декабря 2011

A Collection не обязательно упорядоченный набор элементов, поэтому может не существовать понятия «последний» элемент. Если вы хотите что-то заказать, вы можете использовать SortedSet, который имеет метод last(). Или вы можете использовать List и позвонить mylist.get(mylist.size()-1);

Если вам действительно нужен последний элемент, вы должны использовать List или SortedSet. Но если все, что у вас есть, это 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;
}
46 голосов
/ 07 августа 2013

Iterables.getLast от Google Guava. Он имеет некоторую оптимизацию для List с и SortedSet с тоже.

9 голосов
/ 02 декабря 2011

Ну, одним из решений может быть:

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

Редактировать: Вы должны преобразовать коллекцию в список, прежде чем, возможно, так: new ArrayList (coll)

7 голосов
/ 15 декабря 2016

Это не очень эффективное решение, но работающее:

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;
}
3 голосов
/ 02 декабря 2011

Разумным решением было бы использовать итератор, если вы ничего не знаете о базовой коллекции, но знаете, что существует «последний» элемент.Это не всегда так, не все коллекции заказаны.

Object lastElement = null;

for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
  lastElement = collectionItr.next();
}
2 голосов
/ 02 декабря 2011

В интерфейсе Collection нет метода last() или first(). Чтобы получить последний метод, вы можете либо сделать get(size() - 1) в списке, либо перевернуть список и сделать get(0). Я не вижу необходимости иметь метод last() в любом API-интерфейсе сбора, если вы не имеете дело с Stacks или Queues

0 голосов
/ 12 ноября 2018

Чтобы избежать некоторых проблем, упомянутых выше (ненадежных для нулевых значений и т. Д.), Чтобы получить первый и последний элемент в списке, подход может быть

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;
}

Принято соглашение, что первый / последний элемент пустого списка равен нулю ...

0 голосов
/ 27 ноября 2015

Или вы можете использовать цикл for-each:

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