Як я можу отримати останнє значення ArrayList?
Я не знаю останнього індексу ArrayList.
getLast()
Як я можу отримати останнє значення ArrayList?
Я не знаю останнього індексу ArrayList.
getLast()
Відповіді:
Далі йде частина List
інтерфейсу (який реалізує ArrayList):
E e = list.get(list.size() - 1);
E
- тип елемента. Якщо список порожній, get
викидає анну IndexOutOfBoundsException
. Ви можете знайти всю документацію API тут .
lastElement()
метод для своїх, Vector
але не для ArrayList
. Що з цією неузгодженістю?
У ванільній Java немає елегантного способу.
Бібліотека Google Guava чудова - перевірте їх Iterables
клас . Цей метод викине a, 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);
}
Я використовую клас мікро-утиліти для отримання останнього (і першого) елемента списку:
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);
Якщо ви можете, поміняти ArrayList
для ArrayDeque
, який має зручні методи , як removeLast
.
Немає елегантного способу отримання останнього елемента списку на 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.get(list.size()-1)
є мінімальним прикладом, що показує проблему. Я погоджуюся, що "просунуті" приклади можуть бути суперечливими і, можливо, кращими, я просто хотів показати, як проблема може далі поширюватися. Припустимо, що клас someObject
іноземний, що походить із зовнішньої бібліотеки.
ArrayDeque
натомість.
ArrayList
.
Як зазначено в рішенні, якщо значення 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 та отримати (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();
щоб отримати останній елемент списку.
guava надає інший спосіб отримати останній елемент із List
:
last = Lists.reverse(list).get(0)
якщо поданий список порожній, він видає an IndexOutOfBoundsException
java.util.Collections#reverse
робить це теж.
Оскільки індексація в ArrayList починається з 0 і закінчується на одному місці перед фактичним розміром, отже правильним твердженням для повернення останнього елемента масиву буде:
int last = mylist.get (mylist.size () - 1);
Наприклад:
якщо розмір списку масиву дорівнює 5, то розмір-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
відповідно). Якщо знову не вдасться, перевірте структуру списку.
Все, що вам потрібно зробити, це використовувати size (), щоб отримати останнє значення Arraylist. Для екс. якщо ви ArrayList цілих чисел, то для отримання останнього значення вам доведеться
int lastValue = arrList.get(arrList.size()-1);
Пам'ятайте, що до елементів Arraylist можна отримати доступ, використовуючи значення індексу. Тому ArrayLists зазвичай використовуються для пошуку елементів.
масиви зберігають їх розмір у локальній змінній під назвою "length". Враховуючи масив з назвою "a", ви можете використовувати наступне для посилання на останній індекс, не знаючи значення індексу
a [a.length-1]
щоб присвоїти цьому останньому індексу значення 5, яке ви використовували:
a [a.length-1] = 5;
ArrayList
не масив.
У Котліні ви можете використовувати метод last
:
val lastItem = list.last()