如何获取ArrayList的最后一个值

时间:2009-03-26 22:38:58

标签: java arraylist

如何获取ArrayList的最后一个值?

我不知道ArrayList的最后一个索引。

23 个答案:

答案 0 :(得分:593)

以下是List接口(ArrayList实现)的一部分:

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

E是元素类型。如果列表为空,get会抛出IndexOutOfBoundsException。您可以找到整个API文档here

答案 1 :(得分:183)

在香草Java中没有一种优雅的方式。

Google Guava

Google Guava图书馆很棒 - 请查看他们的Iterables class。如果列表为空,此方法将抛出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);

答案 2 :(得分:178)

这应该这样做:

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

答案 3 :(得分:25)

我使用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();
  }
}

答案 4 :(得分:10)

size()方法返回ArrayList中的元素数。元素的索引值为0(size()-1),因此您可以使用myArrayList.get(myArrayList.size()-1)来检索最后一个元素。

答案 5 :(得分:5)

使用lambdas:

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

答案 6 :(得分:4)

如果可以,请为ArrayList替换ArrayDeque,其中包含removeLast等便捷方法。

答案 7 :(得分:1)

考虑空列表的单行代码是:

T lastItem = list.size() == 0 ? null : list.get(list.size() - 1);

或者如果您不喜欢空值(并且性能不是问题):

Optional<T> lastItem = list.stream().reduce((first, second) -> second);

答案 8 :(得分:1)

如果您有一个Spring项目,则还可以使用Spring(javadoc)中的CollectionUtils.lastElement,并且如果不需要,您不需要添加Google Guave之类的额外依赖项到以前。

这是空值安全的,因此,如果您传递空值,您将只收到空值作为回报。不过,在处理响应时要小心。

这里有一些单元测试来演示它们:

@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)用于声明。

答案 9 :(得分:1)

guava提供了另一种从List获取最后一个元素的方法:

last = Lists.reverse(list).get(0)

如果提供的列表为空,则会抛出IndexOutOfBoundsException

答案 10 :(得分:1)

如解决方案中所述,如果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;

答案 11 :(得分:0)

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

答案 12 :(得分:0)

如果您改用LinkedList,则可以仅使用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(); 

获取列表的最后一个元素。

答案 13 :(得分:0)

在Java中没有优雅的方法来获取列表的最后一个元素(与Python中的items[-1]相比)。

您必须使用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引入了针对此设计缺陷的修复程序,那就太好了。

答案 14 :(得分:0)

由于ArrayList中的索引从0开始并在实际大小之前结束一个位置,因此返回最后一个arraylist元素的正确语句将是:

int last = mylist.get(mylist.size()-1);

例如:

如果数组列表的大小为5,则size-1 = 4将返回最后一个数组元素。

答案 15 :(得分:0)

列表中的最后一项是list.size() - 1。该集合由数组支持,数组从索引0开始。

因此列表中的元素1位于数组

中的索引0处

列表中的元素2位于数组

中的索引1处

列表中的元素3位于数组

中的索引2处

依旧......

答案 16 :(得分:0)

这对我有用。

private ArrayList<String> meals;
public String take(){
  return meals.remove(meals.size()-1);
}

答案 17 :(得分:-1)

使用Stream API的替代方法:

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

导致最后一个元素的可选。

答案 18 :(得分:-1)

您需要做的就是使用size()来获取Arraylist的最后一个值。 对于前者如果你是整数的ArrayList,那么要获得最后一个值,你将不得不

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

请记住,可以使用索引值访问Arraylist中的元素。因此,ArrayLists通常用于搜索项目。

答案 19 :(得分:-2)

数组将它们的大小存储在名为&#39; length&#39;的局部变量中。给定一个名为&#34; a&#34;你可以使用以下内容来引用最后一个索引而不知道索引值

一个[则为a.length-1]

为您将使用的最后一个索引指定值5:

一个[则为a.length-1] = 5;

答案 20 :(得分:-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;
    }

答案 21 :(得分:-3)

在Kotlin中,您可以使用方法last

val lastItem = list.last()

答案 22 :(得分:-3)

如果修改列表,则使用listIterator()并从最后一个索引(分别为size()-1)进行迭代。 如果再次失败,请检查列表结构。