Bir ArrayList'in son değerini nasıl alabilirim?
ArrayList'in son dizinini bilmiyorum.
getLast()
Bir ArrayList'in son değerini nasıl alabilirim?
ArrayList'in son dizinini bilmiyorum.
getLast()
Yanıtlar:
Aşağıdakiler List
arabirimin bir parçasıdır (ArrayList tarafından uygulanır):
E e = list.get(list.size() - 1);
E
öğe türüdür. Liste boşsa, get
bir IndexOutOfBoundsException
. API belgelerinin tamamını burada bulabilirsiniz .
lastElement()
yöntem uygulamaya karar verdiklerini anlayamıyorum Vector
ama bunun için değil ArrayList
. Bu tutarsızlığın nesi var?
Vanilya Java'da zarif bir yol yoktur.
Google Guava kütüphane büyük - onların kontrol Iterables
sınıfı . Bu yöntem , tipik bir yaklaşımda olduğu NoSuchElementException
gibi, bir liste yerine boşsa atar - Çok daha hoş buluyorum veya bir varsayılan belirleme yeteneği:IndexOutOfBoundsException
size()-1
NoSuchElementException
lastElement = Iterables.getLast(iterableList);
Liste boşsa istisna yerine varsayılan bir değer de sağlayabilirsiniz:
lastElement = Iterables.getLast(iterableList, null);
veya Seçenekler'i kullanıyorsanız:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
kontrol etmelisiniz RandomAccess
.
Option
, yerel Java'yı kullanabilirsiniz Optional
. Bu da biraz daha temiz olacaktır: lastElement = Optional.ofNullable(lastElementRaw);
.
bunu yapmalı:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
Listenin son (ve ilk) öğesini almak için micro-util sınıfı kullanıyorum:
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;
}
}
Biraz daha esnek:
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
listenin boş olup olmadığını ve bu nedenle olması gerekip gerekmediğini kontrol etmez isNullOrEmpty
ve bu sorunun bir parçası değildir - ya cevap kümesini geliştirmeye çalışırsınız ya da size (yeniden buluş olan) faydalı sınıflar sağlarsınız.
Lambdas kullanma:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Yapabiliyorsanız, gibi uygun yöntemlere sahip olan ArrayList
bir için değiştirin .ArrayDeque
removeLast
Java'da bir listenin son öğesini almanın zarif bir yolu yoktur (örneğin items[-1]
Python'dakine kıyasla ).
Kullanmak zorundasın list.get(list.size()-1)
.
Karmaşık yöntem çağrıları ile elde edilen listelerle çalışırken geçici çözüm geçici değişkendir:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Bu çirkin ve genellikle pahalı veya hatta çalışmıyor sürümü önlemek için tek seçenek:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Bu tasarım kusuru düzeltmesinin Java API'ye sunulması güzel olurdu.
List
arayüze eklenmeye değmeyecek nadir bir kullanım durumudur . Yalnızca son öğeyle ilgileniyorsanız neden Liste döndüren bir yöntemi çağırmak istersiniz? Bunu daha önce gördüğümü hatırlamıyorum.
list.get(list.size()-1)
sorunu gösteren en az örnektir. "İleri" örneklerin tartışmalı olabileceğini ve büyük olasılıkla bir son durum olabileceğini kabul ediyorum, sadece sorunun nasıl daha da yayılabileceğini göstermek istedim. someObject
Dış kütüphaneden gelen sınıfının yabancı olduğunu varsayalım .
ArrayDeque
.
ArrayList
.
Çözeltide belirtildiği gibi, eğer List
boşsa IndexOutOfBoundsException
, a atılır. Daha iyi bir çözüm Optional
türü kullanmaktır :
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Beklediğiniz gibi, listenin son öğesi şu şekilde döndürülür Optional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Ayrıca boş listelerle de incelikle ilgilenir:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Bunun yerine LinkedList kullanıyorsanız, ilk öğeye ve son öğeye just getFirst()
ve ile erişebilirsiniz getLast()
((size () -1 boyutundan daha temiz bir yol istiyorsanız ve (0) olsun)
LinkedList bildirin
LinkedList<Object> mLinkedList = new LinkedList<>();
O zaman bu, istediğinizi elde etmek için kullanabileceğiniz yöntemlerdir, bu durumda bir listenin İLK ve SON öğesinden bahsediyoruz
/**
* 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);
}
Yani, o zaman kullanabilirsiniz
mLinkedList.getLast();
Listenin son öğesini almak için.
guava , son öğeyi aşağıdakilerden elde etmek için başka bir yol sağlar List
:
last = Lists.reverse(list).get(0)
verilen liste boşsa, IndexOutOfBoundsException
java.util.Collections#reverse
bunu da yapar.
ArrayList içindeki indeksleme 0'dan başladığından ve gerçek boyuttan önce bir yerden sona erdiğinden, son arraylist öğesini döndürmek için doğru ifade şöyle olacaktır:
int last = mylist.get (mylist.size () - 1);
Örneğin:
dizi listesinin boyutu 5 ise, size-1 = 4 son dizi öğesini döndürür.
Listedeki son öğe list.size() - 1
. Koleksiyon bir dizi tarafından desteklenir ve diziler 0 dizininden başlar.
Yani listedeki eleman 1 dizideki 0 dizinindedir
Listedeki öğe 2, dizideki dizin 1'de
Listedeki öğe 3, dizinin 2. dizinindedir
ve bunun gibi..
Buna ne dersiniz .. Sınıfınızda bir yerlerde ...
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;
}
Listenizi değiştirirseniz listIterator()
, son dizinden ( size()-1
sırasıyla) kullanın ve yineleyin . Tekrar başarısız olursanız, liste yapınızı kontrol edin.
Yapmanız gereken tek şey Arraylist'in son değerini almak için size () kullanmaktır. Örn. ArrayList tamsayıları varsa, son değeri almak için
int lastValue = arrList.get(arrList.size()-1);
Unutmayın, bir Arraylist'teki öğelere dizin değerleri kullanılarak erişilebilir. Bu nedenle, ArrayLists genellikle öğeleri aramak için kullanılır.
diziler boyutlarını 'uzunluk' adı verilen yerel bir değişkende saklar. "A" adlı bir dizi verildiğinde, dizin değerini bilmeden son dizine başvurmak için aşağıdakileri kullanabilirsiniz
Bir [a.length-1]
kullanacağınız bu son dizine 5 değeri atamak için:
Bir [a.length-1] '= 5;
ArrayList
bir dizi değil.
Kotlin'de şu yöntemi kullanabilirsiniz last
:
val lastItem = list.last()