ArrayListの最後の値を取得する方法


597

ArrayListの最後の値を取得するにはどうすればよいですか?

ArrayListの最後のインデックスがわかりません。


164
getLastItem()のようなメソッドがないのはなぜだろうと思っていたので、この質問に賛成し、答えがあるかどうかを確認しました。list.size()-1はきれいではありません。
ヌーノ・ゴンサルヴェス

2
@NunoGonçalvesいつでもサブクラス化できます!
Tim

12
あなたはいつもメソッドを持つLinkedListを使うことができますgetLast()
ssedano

6
リンクされたリストはオーバーヘッドのヒープ全体を追加します。以下に示すようにGuavaを使用します。lastElement = Iterables.getLast(iterableList); または、単にsize()-1を使用してget()呼び出しにインデックスを付けます。リンクされたリストを使用する必要がない場合に比べて、醜いことはありません。例外条件に関しては通常の警告が適用されます-ArrayList javadocを参照してください。
RichieHH 2014年

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、2015年

18
@feresrハァッ。彼はリストの最後の値を取得したいと考えています。もちろん、これはsize()が> 0であることを意味します。これは、あらゆる種類の実装に当てはまります。最後まで
読み通す

16
@Bradyは、ArrayListにO(n)の反復を引き起こしません。これは、ご想像のとおり、配列に基づいているためです。したがって、単純なget(<index>)は、配列からの一定時間のリトリーブになります。(JDKソースはこれを確認します)他のリスト実装の場合、これは保証されません。たとえば、LinkedListには一定時間のgetLast()メソッドがあります。
Peter

9
lastElement()彼らVectorがのためにではなくのために単純なメソッドを実装することにした理由が理解できませんArrayList。その矛盾はどうなっていますか?
Stefan Dimitrov 2016

211

バニラジャワにはエレガントな方法はありません。

Googleグアバ

Googleのグアバのライブラリは素晴らしいです-彼らのチェックアウト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 2013

5
@BillMan HashSetの場合はyes、ArrayListの場合はno。
Simon

6
が実装されているIterables.getLastかどうかRandomAccess、したがってO(1)の項目にアクセスしているかどうかをチェックする必要があります。
カールリヒター

1
の代わりにOption、ネイティブJavaを使用できますOptional。また、少しクリーンになりますlastElement = Optional.ofNullable(lastElementRaw);
リトルヘルパー

186

これはそれを行うはずです:

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

29
なめらかな方法はありませんか?:/
kommradHomer

6
あなたはおそらくそれを割り当てることを実証する必要があります...
アントニースタブ

上記が何も割り当て/返さないことを示すのは小さすぎますか?
Brian Agnew 2017年

ArrayListにレコードが1つしかない場合、例外が発生します。解決策は何ですか?
hasnain_ahmad 2018

2
@ hasnain_ahmad、ArraListに1つの要素がある場合、要素は適切に機能します。初期化されていないArrayListおよびゼロレコードのArrayListについて心配する必要があります。そして、この回答は両方のケースを処理します
ファリッド2018

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
グアバを使ってください。再発明しないでください
16:49にUpvote

15
@ClickUpvoteほんの1つの小さなメソッドにGuavaを使用することは、多くの場合過剰です。私の答えは、バニラJavaソリューションを探している人々のためのものです。プロジェクトですでにGuavaを使用している場合は、Guavaベースのソリューションの他の回答を参照してください。
user11153 2016年

5
あなたがいる場合はありませんグアバを使用するには、このようなユーティリティクラスの多くを書いてしまいます。
[Upvote]をクリックします

6
サードパーティのライブラリを追加する許可を取得することは、単一のネイティブJavaクラスを追加するよりもはるかに複雑になる場合があります。たとえば、サードパーティのライブラリを制限およびスクリーニングする政府の契約。
Dave Jarvis

2
isEmptyはリストが空であるかどうかをチェックしないため、空である必要がありisNullOrEmpty、それは質問の一部ではありません。回答のセットを拡張しようとするか、ユーティリティクラスを提供します(これは再発明です)。
カールリヒター

10

このsize()メソッドは、ArrayList内の要素の数を返します。要素のインデックス値は0(size()-1)なのでmyArrayList.get(myArrayList.size()-1)、最後の要素を取得するために使用します。



6

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を返すメソッドを呼び出したいのですか?これまでに一度も見たことはありません。
ドリアン・グレイ、

1
@DorianGrayリストから最後の要素を読み取ることはかなり一般的な操作でありlist.get(list.size()-1)、問題を示す最小限の例です。「高度な」例は物議を醸す可能性があり、場合によってはエッジケースになる可能性があることに同意します。問題がさらに伝播する可能性があることを示したかっただけです。のクラスがsomeObject外部ライブラリから来た外部のものであると仮定しましょう。
Tregoreg、

これがかなり一般的である場所はわかりませんArrayDeque。そうである場合は、代わりに使用することをお勧めします。
ドリアングレイ

@DorianGrayこの質問には多くの賛成意見と意見があるため、の最後の値を取得することに関心を持つ多くの人々がいArrayListます。
Tregoreg、

5

あなたができる場合は、スワップ・アウトArrayListのためArrayDequeのような便利なメソッドを持っています、removeLast


1
これは、直接アクセスの一定のコストと比較して少なくとも線形のコストを意味しますが、言及する価値があります。
カールリヒター

@KarlRichterはい。これは、ArrayDequeのインターフェースにget(int)のようなメソッドがないことに対応しています。これは、「もし可能なら」と私が提案するつもりだったものです。リストがインデックスでアクセスされていない場合は、おそらくリストである必要はありません。
John Glassmyer 2017

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とget(0)よりもクリーンな方法が必要な場合)

実装

LinkedListを宣言する

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

guavaは、から最後の要素を取得する別の方法を提供しますList

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

指定されたリストが空の場合は、 IndexOutOfBoundsException


1
java.util.Collections#reverseそれもします。
RoBeaToZ

1
@RoBeaToZは変更しますが、元のリストを反復処理して変更し、voidを返すため、この目的に適しているとは見なされません。
pero_hero

0

ArrayListのインデックスは0から始まり、実際のサイズの1桁前で終了するため、最後のarraylist要素を返す正しいステートメントは次のようになります。

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

例えば:

配列リストのサイズが5の場合、size-1 = 4は最後の配列要素を返します。


-1

リストの最後のアイテムはlist.size() - 1です。コレクションは配列によってサポートされ、配列はインデックス0から始まります。

したがって、リストの要素1は配列のインデックス0にあります

リストの要素2は配列のインデックス1にあります

リストの要素3は、配列のインデックス2にあります

等々..



-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()を使用するだけです。例のために。整数のArrayListの場合、最後の値を取得するには、

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

Arraylistの要素には、インデックス値を使用してアクセスできます。したがって、ArrayListは通常、アイテムの検索に使用されます。



-4

配列はサイズを「長さ」と呼ばれるローカル変数に格納します。"a"という名前の配列を指定すると、次のように使用して、インデックス値を知らなくても最後のインデックスを参照できます

a [a.length-1]

この最後のインデックスに値5を割り当てるには、次のようにします。

a [a.length-1] = 5;


これはArrayList配列ではありません。
glee8e 2017

-6

ストリームAPIを使用した代替:

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

最後の要素のOptionalになります。


-7

Kotlinでは、次のメソッドを使用できますlast

val lastItem = list.last()

10
これはjavaです
Jachdich

4
Kotlinの作成の背後にあるアイデアの1つは、Javaの少し不快な側面をカバーすることでした。したがって、少なくともデータ分析を行うアプリケーションの部分については、Kotlinを検討することをお勧めするのは理にかなっていると思います。
Eerik Sven Puudist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.