Как я могу получить последнее значение ArrayList?
Я не знаю последний индекс ArrayList.
Как я могу получить последнее значение ArrayList?
Я не знаю последний индекс ArrayList.
Следующее является частью интерфейса List
( который реализует ArrayList):
E e = list.get(list.size() - 1);
E
- это тип элемента. Если список пуст, get
выдает _5 _. Вы можете найти всю документацию по API здесь.
list.back()
или что-то подобное ... было бы хорошей функцией в Java.
- person Pixel; 29.07.2015
lastElement()
метод для своих Vector
, но не для ArrayList
. Что случилось с этой непоследовательностью?
- person Stefan Dimitrov; 07.09.2016
list.get(list.size()--)
работает или не работает?
- person ; 19.12.2017
List::get
последовательный возврат? Т.е. list.get(0);
гарантированно будет элементом первым (если он существует, бла-бла), list.get(1)
вторым и т. д.? Или List
реализации могут индексировать по своему усмотрению, пока их Iterator
функции расположены в соответствующем порядке?
- person BeUndead; 10.10.2018
В ванильной Java нет элегантного способа.
Библиотека Google Guava великолепна - ознакомьтесь с их _ 1_ class. Этот метод вызовет NoSuchElementException
< / a>, если список пуст, в отличие от 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).
- person Karl Richter; 23.06.2017
Option
можно использовать родную Java Optional
. Также будет немного чище: lastElement = Optional.ofNullable(lastElementRaw);
.
- person Little Helper; 07.05.2019
это должно сделать это:
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
, и это не является частью вопроса - либо вы пытаетесь расширить набор ответов, либо предоставляете вам служебные классы (которые являются повторным изобретением).
- person Karl Richter; 23.06.2017
Метод size()
возвращает количество элементов в ArrayList. Значения индекса элементов от 0
до (size()-1)
, поэтому вы должны использовать myArrayList.get(myArrayList.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
. Зачем вам вызывать метод, возвращающий список, если вас интересует только последний элемент? Я не помню, чтобы видел такое раньше.
- person Dorian Gray; 20.10.2019
list.get(list.size()-1)
- минимальный пример, показывающий проблему. Я согласен с тем, что расширенные примеры могут быть спорными и, возможно, крайним случаем, я просто хотел показать, как проблема может распространяться дальше. Предположим, что класс someObject
является чужим, происходящим из внешней библиотеки.
- person Tregoreg; 20.10.2019
ArrayDeque
.
- person Dorian Gray; 20.10.2019
ArrayList
.
- person Tregoreg; 20.10.2019
Используя лямбды:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Если можете, замените ArrayList
на ArrayDeque
, у которого есть такие удобные методы, как removeLast
.
Если вместо этого вы используете LinkedList, вы можете получить доступ к первому и последнему элементам с помощью только getFirst()
и getLast()
(если вам нужен более чистый способ, чем size () -1 и получить (0))
Объявить LinkedList
LinkedList<Object> mLinkedList = new LinkedList<>();
Затем это методы, которые вы можете использовать, чтобы получить то, что хотите, в данном случае мы говорим о ПЕРВОМ и ПОСЛЕДНЕМ элементах списка.
/**
* 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();
чтобы получить последний элемент списка.
Как указано в решении, если 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;
Если у вас есть весенний проект, вы также можете использовать CollectionUtils.lastElement
из Spring (javadoc), и вам не нужно добавлять дополнительную зависимость, например Google Guave, если в этом не было необходимости раньше.
Это нулевое значение, поэтому, если вы передадите null, вы просто получите взамен null. Однако будьте осторожны при обращении с ответом.
Вот несколько модульных тестов, чтобы продемонстрировать их:
@Test
void lastElementOfList() {
var names = List.of("John", "Jane");
var lastName = CollectionUtils.lastElement(names);
then(lastName)
.as("Expected Jane to be the last name in the list")
.isEqualTo("Jane");
}
@Test
void lastElementOfSet() {
var names = new TreeSet<>(Set.of("Jane", "John", "James"));
var lastName = CollectionUtils.lastElement(names);
then(lastName)
.as("Expected John to be the last name in the list")
.isEqualTo("John");
}
Примечание: org.assertj.core.api.BDDAssertions#then(java.lang.String)
используется для утверждений.
Один лайнер, который учитывает пустые списки, будет:
T lastItem = list.size() == 0 ? null : list.get(list.size() - 1);
Или, если вам не нравятся нулевые значения (и производительность не является проблемой):
Optional<T> lastItem = list.stream().reduce((first, second) -> second);
Поскольку индексирование в ArrayList начинается с 0 и заканчивается на одно место до фактического размера, правильным оператором для возврата последнего элемента arrayylist будет:
int last = mylist.get (mylist.size () - 1);
Например:
если размер списка массивов равен 5, то size-1 = 4 вернет последний элемент массива.
guava предоставляет другой способ получить последний элемент из List
:
last = Lists.reverse(list).get(0)
если предоставленный список пуст, он выдает IndexOutOfBoundsException
java.util.Collections#reverse
тоже делает это.
- person RoBeaToZ; 22.04.2020
Это сработало для меня.
private ArrayList<String> meals;
public String take(){
return meals.remove(meals.size()-1);
}
Последний элемент в списке - 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 [a.length-1]
чтобы присвоить этому последнему индексу значение 5, вы должны использовать:
a [a.length-1] = 5;
ArrayList
, а не массив.
- person glee8e; 05.04.2017
Альтернатива с использованием Stream API:
list.stream().reduce((first, second) -> second)
Приводит к необязательному последнему элементу.
В Котлине вы можете использовать метод last
:
val lastItem = list.last()
getLast()
- person ssedano   schedule 26.04.2014getLastElement()
, быть частью java.util.List API. - person AMTerp   schedule 09.04.2021