Как я могу получить последнее значение ArrayList?
Я не знаю последний индекс ArrayList.
getLast()
Как я могу получить последнее значение ArrayList?
Я не знаю последний индекс ArrayList.
getLast()
Ответы:
Следующее является частью List
интерфейса (который реализует ArrayList):
E e = list.get(list.size() - 1);
E
это тип элемента. Если список пуст, get
выдает IndexOutOfBoundsException
. Вы можете найти всю документацию по API здесь .
lastElement()
метод для их, Vector
но не для ArrayList
. Что случилось с этим несоответствием?
В ванильной Java нет элегантного способа.
Библиотека Google Guava великолепна - проверьте их Iterables
класс . Этот метод будет выдавать, NoSuchElementException
если список пуст, в отличие IndexOutOfBoundsException
от обычного size()-1
подхода - я считаю, что NoSuchElementException
гораздо лучше, или возможность указать значение по умолчанию:
lastElement = Iterables.getLast(iterableList);
Вы также можете указать значение по умолчанию, если список пуст, вместо исключения:
lastElement = Iterables.getLast(iterableList, null);
или, если вы используете параметры:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
проверку, RandomAccess
реализована ли она и, следовательно, имеет ли она доступ к элементу в O (1).
Option
вы можете использовать нативную Java Optional
. Это также будет немного чище lastElement = Optional.ofNullable(lastElementRaw);
.
это должно сделать это:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
Я использую класс micro-util для получения последнего (и первого) элемента списка:
public final class Lists {
private Lists() {
}
public static <T> T getFirst(List<T> list) {
return list != null && !list.isEmpty() ? list.get(0) : null;
}
public static <T> T getLast(List<T> list) {
return list != null && !list.isEmpty() ? list.get(list.size() - 1) : null;
}
}
Чуть более гибкий:
import java.util.List;
/**
* Convenience class that provides a clearer API for obtaining list elements.
*/
public final class Lists {
private Lists() {
}
/**
* Returns the first item in the given list, or null if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a first item.
*
* @return null if the list is null or there is no first item.
*/
public static <T> T getFirst( final List<T> list ) {
return getFirst( list, null );
}
/**
* Returns the last item in the given list, or null if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a last item.
*
* @return null if the list is null or there is no last item.
*/
public static <T> T getLast( final List<T> list ) {
return getLast( list, null );
}
/**
* Returns the first item in the given list, or t if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a first item.
* @param t The default return value.
*
* @return null if the list is null or there is no first item.
*/
public static <T> T getFirst( final List<T> list, final T t ) {
return isEmpty( list ) ? t : list.get( 0 );
}
/**
* Returns the last item in the given list, or t if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a last item.
* @param t The default return value.
*
* @return null if the list is null or there is no last item.
*/
public static <T> T getLast( final List<T> list, final T t ) {
return isEmpty( list ) ? t : list.get( list.size() - 1 );
}
/**
* Returns true if the given list is null or empty.
*
* @param <T> The generic list type.
* @param list The list that has a last item.
*
* @return true The list is empty.
*/
public static <T> boolean isEmpty( final List<T> list ) {
return list == null || list.isEmpty();
}
}
isEmpty
не проверяет, является ли список пустым и должен ли он быть таким, isNullOrEmpty
и это не является частью вопроса - либо вы пытаетесь расширить набор ответов, либо предоставляете вам служебные классы (которые являются переизобретением).
Используя лямбды:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
В Java нет элегантного способа получить последний элемент списка (по сравнению, например, items[-1]
с Python).
Вы должны использовать list.get(list.size()-1)
.
При работе со списками, полученными с помощью сложных вызовов методов, обходной путь заключается во временной переменной:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Это единственный вариант избежать уродливой и зачастую дорогой или даже не работающей версии:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Было бы хорошо, если бы исправление для этого недостатка дизайна было введено в Java API.
List
интерфейс. Зачем вам вызывать метод, возвращающий List, если вас интересует только последний элемент? Я не помню, я видел это вообще раньше.
list.get(list.size()-1)
является минимальным примером, показывающим проблему. Я согласен, что «продвинутые» примеры могут быть спорными и, возможно, крайним случаем, я просто хотел показать, как проблема может распространяться дальше. Предположим, что класс someObject
иностранный, пришедший из внешней библиотеки.
ArrayDeque
вместо этого.
ArrayList
.
Если вы можете, замените ArrayList
для ArrayDeque
, который имеет удобные методы, как removeLast
.
Как указано в решении, если List
пусто, то IndexOutOfBoundsException
выбрасывается. Лучшее решение - использовать Optional
тип:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Как и следовало ожидать, последний элемент списка возвращается как Optional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Это также изящно имеет дело с пустыми списками:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Если вместо этого вы используете LinkedList, вы можете получить доступ к первому и последнему элементу с помощью just getFirst()
и getLast()
(если вам нужен более чистый способ, чем size () -1 и get (0))
Объявить LinkedList
LinkedList<Object> mLinkedList = new LinkedList<>();
Тогда это методы, которые вы можете использовать, чтобы получить то, что вы хотите, в данном случае мы говорим о элементах FIRST и LAST списка
/**
* Returns the first element in this list.
*
* @return the first element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
/**
* Returns the last element in this list.
*
* @return the last element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}
/**
* Removes and returns the first element from this list.
*
* @return the first element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
/**
* Removes and returns the last element from this list.
*
* @return the last element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
/**
* Inserts the specified element at the beginning of this list.
*
* @param e the element to add
*/
public void addFirst(E e) {
linkFirst(e);
}
/**
* Appends the specified element to the end of this list.
*
* <p>This method is equivalent to {@link #add}.
*
* @param e the element to add
*/
public void addLast(E e) {
linkLast(e);
}
Итак, тогда вы можете использовать
mLinkedList.getLast();
чтобы получить последний элемент списка.
guava предоставляет другой способ получить последний элемент из List
:
last = Lists.reverse(list).get(0)
если предоставленный список пуст, он бросает IndexOutOfBoundsException
java.util.Collections#reverse
делает это тоже.
Поскольку индексирование в ArrayList начинается с 0 и заканчивается на одно место перед фактическим размером, следовательно, правильный оператор для возврата последнего элемента arraylist будет выглядеть так:
int last = mylist.get (mylist.size () - 1);
Например:
если размер списка массивов равен 5, то size-1 = 4 вернет последний элемент массива.
Последний элемент в списке list.size() - 1
. Коллекция поддерживается массивом, а массивы начинаются с индекса 0.
Таким образом, элемент 1 в списке имеет индекс 0 в массиве.
Элемент 2 в списке находится по индексу 1 в массиве
Элемент 3 в списке находится по индексу 2 в массиве
и так далее..
Как насчет этого .. Где-то в вашем классе ...
List<E> list = new ArrayList<E>();
private int i = -1;
public void addObjToList(E elt){
i++;
list.add(elt);
}
public E getObjFromList(){
if(i == -1){
//If list is empty handle the way you would like to... I am returning a null object
return null; // or throw an exception
}
E object = list.get(i);
list.remove(i); //Optional - makes list work like a stack
i--; //Optional - makes list work like a stack
return object;
}
Если вы измените свой список, используйте listIterator()
и итерируйте последний индекс (то есть size()-1
соответственно). Если вы снова потерпите неудачу, проверьте структуру списка.
Все, что вам нужно сделать, это использовать size (), чтобы получить последнее значение Arraylist. Например если вы ArrayList из целых чисел, то для получения последнего значения вам придется
int lastValue = arrList.get(arrList.size()-1);
Помните, что к элементам в Arraylist можно получить доступ, используя значения индекса. Поэтому ArrayLists обычно используются для поиска элементов.
Массивы хранят свой размер в локальной переменной, называемой «длина». Имея массив с именем "a", вы можете использовать следующее для ссылки на последний индекс, не зная значения индекса
а [a.length-1]
чтобы присвоить значение 5 этому последнему индексу, который вы бы использовали:
а [a.length-1] = 5;
ArrayList
не массив.
В Kotlin вы можете использовать метод last
:
val lastItem = list.last()