Как я могу получить последнее значение ArrayList?
Я не знаю последнего индекса ArrayList.
Как я могу получить последнее значение ArrayList?
Я не знаю последнего индекса ArrayList.
Ниже представлен интерфейс List
(который реализует ArrayList):
E e = list.get(list.size() - 1);
E
- тип элемента. Если список пуст, get
выдает IndexOutOfBoundsException
. Вы можете найти всю документацию API здесь.
В ванильной Java нет элегантного способа.
библиотека Google Guava - проверьте их Iterables
класс. Этот метод будет вызывать NoSuchElementException
, если список пуст, в отличие от IndexOutOfBoundsException
, как и при типичном подходе size()-1
- я нахожу NoSuchElementException
намного приятнее или можно указать значение по умолчанию:
lastElement = Iterables.getLast(iterableList);
Вы также можете указать значение по умолчанию, если список пуст, а не исключение:
lastElement = Iterables.getLast(iterableList, null);
или, если вы используете Options:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(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();
}
}
Метод size()
возвращает количество элементов в ArrayList. Значения индексов элементов 0
через (size()-1)
, поэтому вы должны использовать myArrayList.get(myArrayList.size()-1)
для извлечения последнего элемента.
Использование лямбда:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Если вы можете, замените 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;
Let ArrayList is myList
public void getLastValue(List myList){
// Check ArrayList is null or Empty
if(myList == null || myList.isEmpty()){
return;
}
// check size of arrayList
int size = myList.size();
// Since get method of Arraylist throws IndexOutOfBoundsException if index >= size of arrayList. And in arraylist item inserts from 0th index.
//So please take care that last index will be (size of arrayList - 1)
System.out.print("last value := "+myList.get(size-1));
}
Если вы используете LinkedList вместо этого, вы можете получить доступ к первому элементу и последнему с помощью только getFirst()
и getLast()
(если вы хотите более чистый путь, чем размер() -1, и получите (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();
для получения последнего элемента списка.
Не существует элегантного способа получить последний элемент списка в 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.
В Kotlin вы можете использовать метод last
:
val lastItem = list.last()
Последний элемент в списке list.size() - 1
. Коллекция поддерживается массивом, а массивы начинаются с индекса 0.
Итак, элемент 1 в списке находится в индексе 0 в массиве
Элемент 2 в списке имеет индекс 1 в массиве
Элемент 3 в списке находится в индексе 2 в массиве
и т.д.
Если вы измените свой список, используйте listIterator()
и итерации из последнего индекса (т.е. size()-1
соответственно).
Если вы снова не сработали, проверьте структуру списка.
Как насчет этого.. Где-то в вашем классе...
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;
}
Все, что вам нужно сделать, это использовать size(), чтобы получить последнее значение Arraylist. Напр. если вы ArrayList целых чисел, то для получения последнего значения вам придется
int lastValue = arrList.get(arrList.size()-1);
Помните, что элементы в Arraylist могут быть доступны с использованием значений индекса. Поэтому ArrayLists обычно используются для поиска элементов.
массивы сохраняют свой размер в локальной переменной с именем "длина". Учитывая массив с именем "a", вы можете использовать следующее для ссылки на последний индекс, не зная значения индекса
а [a.length-1]
чтобы присвоить значение 5 этому последнему индексу, который вы использовали бы:
а [a.length-1] = 5;
Альтернатива с использованием Stream API:
list.stream().reduce((first, second) -> second)
Результаты в Необязательном из последнего элемента.