web-dev-qa-db-ja.com

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

ArrayListの最後の値を取得する方法を教えてください。

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

504
Jessy

以下は List インタフェース(ArrayListが実装する)の一部です。

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

Eは要素型です。リストが空の場合、getIndexOutOfBoundsException をスローします。 APIドキュメント全体を見ることができます ここ

586

Vanilla Javaには優雅な方法はありません。

Google Guava

Google Guava ライブラリは素晴らしいです - 彼らの Iterables class を調べてください。このメソッドは、リストが空の場合、 NoSuchElementException とは対照的に IndexOutOfBoundsException をスローします。通常のsize()-1アプローチとは異なり、NoSuchElementException muchが見つかります。より良い、またはデフォルトを指定する機能:

lastElement = Iterables.getLast(iterableList);

リストが空の場合は、例外ではなくデフォルト値を指定することもできます。

lastElement = Iterables.getLast(iterableList, null);

または、Optionsを使っているのなら:

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

これはそれをすべきです:

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

私はリストの最後(そして最初)の要素を取得するために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();
  }
}
25
user11153

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

10
Ken Paul

ラムダを使う:

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

可能であれば、ArrayListArrayDequeに交換してください。これはremoveLastのような便利なメソッドを持っています。

4
John Glassmyer

解決策で述べたように、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;
1
Colin Breame

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

リストの最後の要素を取得します。

0

Stream APIを使用した代替方法

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

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

0
Terran
            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));
        }
0
Alok Mishra

リストの最後の項目はlist.size() - 1です。コレクションは配列によって支えられており、配列はインデックス0から始まります。

そのため、リストの要素1は配列のインデックス0にあります

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

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

等々..

0
MircoProgram

Javaではリストの最後の要素を取得するelegant方法はありません(たとえば、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に導入されていればいいでしょう。

0
Tregoreg