Как получить последнее значение ArrayList

Как я могу получить последнее значение ArrayList?

Я не знаю последнего индекса ArrayList.

Ответ 1

Ниже представлен интерфейс List (который реализует ArrayList):

E e = list.get(list.size() - 1);

E - тип элемента. Если список пуст, get выдает IndexOutOfBoundsException. Вы можете найти всю документацию API здесь.

Ответ 2

В ванильной Java нет элегантного способа.

Google Guava

библиотека 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);

Ответ 3

это должно сделать это:

if (arrayList != null && !arrayList.isEmpty()) {
  T item = arrayList.get(arrayList.size()-1);
}

Ответ 4

Я использую класс 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();
  }
}

Ответ 5

Метод size() возвращает количество элементов в ArrayList. Значения индексов элементов 0 через (size()-1), поэтому вы должны использовать myArrayList.get(myArrayList.size()-1) для извлечения последнего элемента.

Ответ 6

Использование лямбда:

Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);

Ответ 7

Если вы можете, замените ArrayList на ArrayDeque, который имеет удобные методы, такие как removeLast.

Ответ 8

Как указано в решении, если 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;

Ответ 9

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

Ответ 10

Если вы используете 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(); 

для получения последнего элемента списка.

Ответ 11

Не существует элегантного способа получить последний элемент списка в 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.

Ответ 12

В Kotlin вы можете использовать метод last:

val lastItem = list.last()

Ответ 13

Последний элемент в списке list.size() - 1. Коллекция поддерживается массивом, а массивы начинаются с индекса 0.

Итак, элемент 1 в списке находится в индексе 0 в массиве

Элемент 2 в списке имеет индекс 1 в массиве

Элемент 3 в списке находится в индексе 2 в массиве

и т.д.

Ответ 14

Если вы измените свой список, используйте listIterator() и итерации из последнего индекса (т.е. size()-1 соответственно). Если вы снова не сработали, проверьте структуру списка.

Ответ 15

Как насчет этого.. Где-то в вашем классе...

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

Ответ 16

Все, что вам нужно сделать, это использовать size(), чтобы получить последнее значение Arraylist. Напр. если вы ArrayList целых чисел, то для получения последнего значения вам придется

int lastValue = arrList.get(arrList.size()-1);

Помните, что элементы в Arraylist могут быть доступны с использованием значений индекса. Поэтому ArrayLists обычно используются для поиска элементов.

Ответ 17

массивы сохраняют свой размер в локальной переменной с именем "длина". Учитывая массив с именем "a", вы можете использовать следующее для ссылки на последний индекс, не зная значения индекса

а [a.length-1]

чтобы присвоить значение 5 этому последнему индексу, который вы использовали бы:

а [a.length-1] = 5;

Ответ 18

Альтернатива с использованием Stream API:

list.stream().reduce((first, second) -> second)

Результаты в Необязательном из последнего элемента.