ArrayList의 마지막 값을 얻는 방법


597

ArrayList의 마지막 값을 어떻게 얻을 수 있습니까?

ArrayList의 마지막 색인을 모르겠습니다.


164
getLastItem ()과 같은 메소드가없는 이유가 궁금하여 답변이 있는지 보았 기 때문에이 질문에 찬성했습니다. list.size ()-1은 예쁘지 않습니다.
Nuno Gonçalves

2
@ NunoGonçalves 언제든지 서브 클래 싱 할 수 있습니다!
Tim

12
항상 다음과 같은 방법을 가진 LinkedList를 사용할 수 있습니다getLast()
ssedano

6
연결된 리스팅은 전체 오버 헤드를 추가합니다. 아래와 같이 Guava를 사용하십시오. lastElement = Iterables.getLast (iterableList); 또는 단순히 size ()-1로 get () 호출을 인덱싱하십시오. 필요하지 않을 때 연결된 목록을 사용하는 것과 비교할 때 추악하지 않습니다. 예외 조건과 관련하여 일반적인주의 사항이 적용됩니다. ArrayList javadoc을 참조하십시오.
RichieHH

10
list.size () -1을 사용하는 것은 예쁘지 않지만이를 위해 써드 파티 API를 사용하는 것은 더 나쁩니다.
Javo

답변:


692

다음은 List인터페이스 (ArrayList가 구현하는)의 일부입니다 .

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

E요소 유형입니다. 목록이 비어 get있으면를 던집니다 IndexOutOfBoundsException. 전체 API 설명서는 여기에서 찾을 수 있습니다 .


5
이로 인해 목록이 반복됩니까? 그것은 나에게 매우 효율적으로 보이지 않습니다. C ++에서 왔는데,리스트 객체에 실제 front () 및 back () 메소드가 있으며 헤드 및 테일 참조로 내부적으로 구현됩니다. Java에도 비슷한 메커니즘이 있습니까?
Brady

26
작동하지 않습니다. 목록이 비어 있으면 list.size ()는 0을 반환하고 list.get (-1)로 끝납니다.
FRR

18
@feresr 허. 그는 목록에서 마지막 값을 얻으려고합니다. 물론 이것은 size ()가> 0임을 의미합니다. 이는 모든 종류의 구현에 해당됩니다. 끝까지 읽으면 의견을 작성하는 데 필요한 시간과 응답 시간을 절약 할 수 있습니다. :) 내 대답에 "목록이 비어 있으면 IndexOutOfBoundsException이 발생합니다"
Johannes Schaub-litb

16
@Brady는 ArrayList에 대해 O (n) 반복을 발생시키지 않습니다. 추측 할 수 있듯이 배열에 의해 지원되기 때문입니다. 따라서 간단한 get (<index>)는 배열에서 상수 시간 검색을 수행합니다. (JDK 소스가 이것을 확인합니다) 다른 목록 구현의 경우 이것이 보장되지 않으므로 예를 들어 LinkedList에는 상수 시간 인 getLast () 메소드가 있습니다.
Peter

9
왜 그들이 간단한 lastElement()메소드 를 구현하기로 결정 Vector했지만 이해할 수 없는지 이해할 수 없습니다 ArrayList. 그 불일치가 무엇입니까?
Stefan Dimitrov

211

바닐라 자바에는 우아한 방법이 없습니다.

구글 구아바

구글 구아바 라이브러리는 중대하다 - 자신의 체크 아웃 Iterables클래스를 . 이 방법은 일반적인 접근 방식 과 NoSuchElementException마찬가지로 목록이 비어 있는 경우 를 던집니다. 훨씬 더 좋 거나 기본값을 지정하는 기능이 있습니다.IndexOutOfBoundsExceptionsize()-1NoSuchElementException

lastElement = Iterables.getLast(iterableList);

예외 대신 목록이 비어있는 경우 기본값을 제공 할 수도 있습니다.

lastElement = Iterables.getLast(iterableList, null);

또는 옵션을 사용하는 경우 :

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

3
이 방법이 마지막 요소를 찾기 위해 목록을 선형으로 걷는 지 알고 있습니까?
BillMan

5
@BillMan HashSet 예인 경우 ArrayList 번호 인 경우.
Simon

6
구현 Iterables.getLast여부 를 확인 RandomAccess하여 O (1)의 항목에 액세스 하는지 확인 해야합니다 .
Karl Richter

1
대신 Option기본 Java를 사용할 수 있습니다 Optional. 또한 약간 더 깨끗 lastElement = Optional.ofNullable(lastElementRaw);합니다.
작은 도우미

186

이 작업을 수행해야합니다.

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

29
그것을 할 수있는 매끄러운 방법이 없습니까? : /
kommradHomer

6
적어도 할당을 시연해야합니다 ... ArrayList.get은 부작용이 없습니다.
Antony Stubbs

위의 내용이 할당 / 반환되지 않음을 나타내는 것이 너무 작은가요?
Brian Agnew

ArrayList에 하나의 레코드 만있는 경우 예외가 발생합니다. 해결책은 무엇입니까?
hasnain_ahmad

2
@hasnain_ahmad, ArraList에 하나의 요소가 있으면 제대로 작동하면 초기화되지 않은 ArrayList 및 ArrayList에 대해 레코드가 0 인 것에 대해 걱정해야합니다. 이 답변은 두 경우 모두를 처리합니다
Farid

27

목록의 마지막 (그리고 첫 번째) 요소를 얻기 위해 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();
  }
}

8
구아바를 사용하십시오. 재발 명하지 마십시오
클릭

15
@ClickUpvote 하나의 작은 방법으로 구아바를 사용하는 것은 많은 경우에 과잉입니다. 내 대답은 바닐라 자바 ​​솔루션을 찾는 사람들을위한 입니다. 프로젝트에서 이미 Guava를 사용하고 있다면 Guava 기반 솔루션에 대한 다른 답변을 참조하십시오.
user11153

5
당신이 경우 하지 않는 구아바를 사용하여, 당신은 이와 같은 유틸리티 클래스를 많이 쓰는 끝낸다.
Upvote를 클릭하십시오

6
때로는 타사 라이브러리를 추가 할 수있는 권한을 얻는 것이 단일 네이티브 Java 클래스를 추가하는 것보다 훨씬 복잡 할 수 있습니다. 예를 들어 정부는 제 3 자 라이브러리를 제한하고 선별하는 계약을합니다.
Dave Jarvis

2
isEmpty목록이 비어 있는지 여부를 확인하지 않으므로 isNullOrEmpty질문의 일부가 아닙니다. 답변 세트를 향상 시키거나 유틸리티 클래스 (재발 명)를 제공하십시오.
Karl Richter

10

size()메소드는 ArrayList의 요소 수를 리턴합니다. 요소의 색인 값은 0through (size()-1)이므로 myArrayList.get(myArrayList.size()-1)마지막 요소를 검색하는 데 사용 합니다.



5

당신이 할 수있는 경우를 교환 ArrayList위해 ArrayDeque같은 편리한 방법을 가지고있는 removeLast.


1
이는 직접 액세스에 대한 일정한 비용과 비교할 때 최소한 선형 비용이지만 언급 할 가치가 있음을 의미합니다.
Karl Richter

@KarlRichter 예. 이것은 ArrayDeque의 인터페이스에 get (int)와 같은 메소드가없는 것과 일치합니다. 이것이 바로 "가능한 경우"라는 의미입니다. 인덱스로 목록에 액세스하지 않는 경우 목록 일 필요는 없습니다.
John Glassmyer

5

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. 인터페이스에 추가 할 가치가없는 드문 사용 사례입니다 . 마지막 요소에만 관심이 있다면 왜 List를 반환하는 메소드를 호출하고 싶습니까? 나는 전에 그것을 전혀 보지 못했다.
Dorian Grey

1
@DorianGray 목록에서 마지막 요소를 읽는 것은 매우 일반적인 작업이며 list.get(list.size()-1)문제를 보여주는 최소한의 예입니다. 나는 "고급"예제가 논란의 여지가 있고 아마도 중요한 경우 일 수 있음에 동의합니다. 문제가 어떻게 더 전파 될 수 있는지 보여주고 싶었습니다. 의 클래스 someObject가 외부 라이브러리에서 온 외부 클래스라고 가정합시다 .
Tregoreg

나는 이것이 일반적인 곳을 알지 못하며, 그렇다면 그것이 ArrayDeque대신 더 잘 사용하는 것입니다.
Dorian Grey

@DorianGray이 질문에는 많은 찬사와 의견이 있으므로의 마지막 가치를 얻는 데 관심이있는 사람들이 많이 ArrayList있습니다.
Tregoreg

3

솔루션에 명시된 바와 같이 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;

2

당신이 대신 LinkedList의를 사용하는 경우에는 첫 번째 요소와 단지와 마지막에 액세스 할 수 있습니다 getFirst()getLast()()는 (크기보다 깔끔한 방법을 원하는 경우) -1 (0 얻을)

이행

연결리스트 선언

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

목록의 마지막 요소를 가져옵니다.


1

구아바 는 다음에서 마지막 요소를 얻는 또 다른 방법을 제공합니다 List.

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

제공된 목록이 비어 있으면 IndexOutOfBoundsException


1
java.util.Collections#reverse그것도 그렇습니다.
RoBeaToZ

1
@RoBeaToZ, 그것은 반복하지만 원래 목록을 변경하고 void를 반환 하므로이 목적에 맞지 않는 것으로 간주됩니다.
pero_hero

0

ArrayList의 인덱싱은 0에서 시작하여 실제 크기보다 한 곳에서 끝나므로 마지막 arraylist 요소를 반환하는 올바른 명령문은 다음과 같습니다.

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

예를 들면 다음과 같습니다.

배열 목록의 크기가 5이면 size-1 = 4는 마지막 배열 요소를 반환합니다.


-1

목록의 마지막 항목은 list.size() - 1입니다. 컬렉션은 배열에 의해 지원되며 배열은 인덱스 0에서 시작합니다.

따라서 목록의 요소 1이 배열의 인덱스 0에 있습니다.

목록의 요소 2가 배열의 인덱스 1에 있습니다.

목록의 요소 3이 배열의 인덱스 2에 있습니다.

등등..


3
@JohannesSchaub의 이전 답변에 대한 추가 가치 없음
Karl Richter

-3

어때요 .. 수업 어딘가에 ...

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

-3

목록을 수정하면 listIterator()마지막 색인 ( size()-1각각) 을 사용 하고 반복하십시오 . 다시 실패하면 목록 구조를 확인하십시오.


-3

arraylist의 마지막 값을 얻으려면 size ()를 사용하면됩니다. 예를 들어. 정수 목록을 배열하면 마지막 값을 얻으려면

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

Arraylist의 요소는 인덱스 값을 사용하여 액세스 할 수 있습니다. 따라서 일반적으로 ArrayLists는 항목을 검색하는 데 사용됩니다.


4
@JohannesSchaub의 이전 답변에 대한 추가 가치 없음
Karl Richter

-4

배열은 크기를 'length'라는 지역 변수에 저장합니다. "a"라는 배열이 주어지면 다음을 사용하여 인덱스 값을 몰라도 마지막 인덱스를 참조 할 수 있습니다

a [길이 -1]

이 마지막 인덱스에 5의 값을 할당하려면 다음을 사용하십시오.

a [길이 -1] = 5;


이것은 ArrayList배열 이 아닙니다.
glee8e

-6

Stream API를 사용하는 대안 :

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

마지막 요소의 옵션이됩니다.


-7

Kotlin에서는 다음 방법을 사용할 수 있습니다 last.

val lastItem = list.last()

10
이것은 자바이지만
Jachdich

4
Kotlin을 제작 한 아이디어 중 하나는 Java의 불편한 부분을 다루는 것이 었습니다. 따라서 적어도 데이터 분석을 수행하는 응용 프로그램 부분에는 Kotlin을 고려하는 것이 좋습니다.
Eerik Sven Puudist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.