ArrayListの最後の値を取得するにはどうすればよいですか?
ArrayListの最後のインデックスがわかりません。
getLast()
ArrayListの最後の値を取得するにはどうすればよいですか?
ArrayListの最後のインデックスがわかりません。
getLast()
回答:
以下はList
(ArrayListが実装する)インターフェースの一部です。
E e = list.get(list.size() - 1);
E
要素タイプです。リストが空の場合、をget
スローしIndexOutOfBoundsException
ます。APIドキュメント全体はこちらにあります。
lastElement()
彼らVector
がのためにではなくのために単純なメソッドを実装することにした理由が理解できませんArrayList
。その矛盾はどうなっていますか?
バニラジャワにはエレガントな方法はありません。
Googleのグアバのライブラリは素晴らしいです-彼らのチェックアウトIterables
クラスを。このメソッドは、通常のアプローチのようにNoSuchElementException
、とは対照的に、リストが空の場合にをスローします-私ははるかに優れているか、デフォルトを指定する機能を見つけます:IndexOutOfBoundsException
size()-1
NoSuchElementException
lastElement = Iterables.getLast(iterableList);
リストが空の場合は、例外の代わりにデフォルト値を指定することもできます。
lastElement = Iterables.getLast(iterableList, null);
または、オプションを使用している場合:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
かどうかRandomAccess
、したがってO(1)の項目にアクセスしているかどうかをチェックする必要があります。
Option
、ネイティブJavaを使用できますOptional
。また、少しクリーンになりますlastElement = Optional.ofNullable(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();
}
}
isEmpty
はリストが空であるかどうかをチェックしないため、空である必要がありisNullOrEmpty
、それは質問の一部ではありません。回答のセットを拡張しようとするか、ユーティリティクラスを提供します(これは再発明です)。
ラムダを使用する:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
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を返すメソッドを呼び出したいのですか?これまでに一度も見たことはありません。
list.get(list.size()-1)
、問題を示す最小限の例です。「高度な」例は物議を醸す可能性があり、場合によってはエッジケースになる可能性があることに同意します。問題がさらに伝播する可能性があることを示したかっただけです。のクラスがsomeObject
外部ライブラリから来た外部のものであると仮定しましょう。
ArrayDeque
。そうである場合は、代わりに使用することをお勧めします。
ArrayList
ます。
あなたができる場合は、スワップ・アウト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()
(サイズ()-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();
リストの最後の要素を取得します。
ArrayListのインデックスは0から始まり、実際のサイズの1桁前で終了するため、最後のarraylist要素を返す正しいステートメントは次のようになります。
int last = mylist.get(mylist.size()-1);
例えば:
配列リストのサイズが5の場合、size-1 = 4は最後の配列要素を返します。
リストの最後のアイテムはlist.size() - 1
です。コレクションは配列によってサポートされ、配列はインデックス0から始まります。
したがって、リストの要素1は配列のインデックス0にあります
リストの要素2は配列のインデックス1にあります
リストの要素3は、配列のインデックス2にあります
等々..
これはどうですか。クラスのどこかに...
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;
}
リストを変更する場合はlistIterator()
、最後のインデックスを使用して反復します(size()-1
それぞれ)。再び失敗する場合は、リスト構造を確認してください。
Arraylistの最後の値を取得するには、size()を使用するだけです。例のために。整数のArrayListの場合、最後の値を取得するには、
int lastValue = arrList.get(arrList.size()-1);
Arraylistの要素には、インデックス値を使用してアクセスできます。したがって、ArrayListは通常、アイテムの検索に使用されます。
配列はサイズを「長さ」と呼ばれるローカル変数に格納します。"a"という名前の配列を指定すると、次のように使用して、インデックス値を知らなくても最後のインデックスを参照できます
a [a.length-1]
この最後のインデックスに値5を割り当てるには、次のようにします。
a [a.length-1] = 5;
ArrayList
配列ではありません。
Kotlinでは、次のメソッドを使用できますlast
。
val lastItem = list.last()