ArrayListの最後の値を取得する方法を教えてください。
ArrayListの最後のインデックスがわかりません。
以下は List
インタフェース(ArrayListが実装する)の一部です。
E e = list.get(list.size() - 1);
E
は要素型です。リストが空の場合、get
は IndexOutOfBoundsException
をスローします。 APIドキュメント全体を見ることができます ここ 。
Vanilla Javaには優雅な方法はありません。
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);
これはそれをすべきです:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
私はリストの最後(そして最初)の要素を取得するために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();
}
}
size()
メソッドはArrayListの要素数を返します。要素のインデックス値は0
から(size()-1)
までなので、最後の要素を取得するにはmyArrayList.get(myArrayList.size()-1)
を使います。
ラムダを使う:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
可能であれば、ArrayList
をArrayDeque
に交換してください。これはremoveLast
のような便利なメソッドを持っています。
解決策で述べたように、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;
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();
リストの最後の要素を取得します。
Stream APIを使用した代替方法
list.stream().reduce((first, second) -> second)
最後の要素のOptionalになります。
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));
}
リストの最後の項目はlist.size() - 1
です。コレクションは配列によって支えられており、配列はインデックス0から始まります。
そのため、リストの要素1は配列のインデックス0にあります
リストの要素2は配列のインデックス1にあります
リストの要素3は配列のインデックス2にあります
等々..
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に導入されていればいいでしょう。