关于java:如何获取ArrayList的最后一个值

How to get the last value of an ArrayList

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

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


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

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

E是元素类型。如果列表为空,get将抛出IndexOutOfBoundsException。您可以在此处找到完整的API文档。


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

谷歌番石榴

Google Guava图书馆很棒 - 查看他们的Iterables课程。如果列表为空,此方法将抛出NoSuchElementException,而不是IndexOutOfBoundsException,与典型的size()-1方法一样 - 我发现NoSuchElementException更好,或者指定默认值的能力:

1
lastElement = Iterables.getLast(iterableList);

如果列表为空,您还可以提供默认值,而不是例外:

1
lastElement = Iterables.getLast(iterableList, null);

或者,如果您使用选项:

1
2
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);


这应该这样做:

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


我使用micro-util类来获取列表的最后一个(和第一个)元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
    }
}

稍微灵活一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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)来检索最后一个元素。


使用lambdas:

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


如果可以,将ArrayList替换为ArrayDeque,其中包含方便的方法,如removeLast


如解决方案中所述,如果List为空,则抛出IndexOutOfBoundsException。更好的解决方案是使用Optional类型:

1
2
3
4
5
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返回:

1
2
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;

它还优雅地处理空列表:

1
2
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;

如果你使用LinkedList,你可以只用getFirst()getLast()访问第一个元素和最后一个元素(如果你想要一个比size()-1和get(0)更清晰的方法)

履行

声明LinkedList

1
LinkedList<Object> mLinkedList = new LinkedList<>();

然后这是你可以用来获得你想要的方法,在这种情况下我们讨论列表的FIRST和LAST元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
     * 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);
    }

那么,你可以使用

1
mLinkedList.getLast();

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


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

你必须使用list.get(list.size()-1)

使用通过复杂方法调用获得的列表时,解决方法位于临时变量中:

1
2
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);

这是避免丑陋且通常很昂贵甚至无法工作的唯一选择:

1
2
3
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
    someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);

如果将此设计缺陷的修复程序引入Java API,那将是很好的。


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

因此列表中的元素1位于数组中的索引0处

列表中的元素2位于数组中的索引1处

列表中的元素3位于数组中的索引2处

等等..


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

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

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


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


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

一个[则为a.length-1]

为您将使用的最后一个索引分配值5:

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


使用Stream API的替代方案:

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

结果是最后一个元素的可选项。


这个怎么样..
你班上的某个地方......

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
    }