Как получить последний элемент списка java
Перейти к содержимому

Как получить последний элемент списка java

  • автор:

Есть список. Есть цикл. Как в цикле указать последний элемент списка?

Но все равно интересно, если бы я удаление элемента оставил бы перед циклом. Получается что при выполнении цикла был бы сбой, так как индекс последнего элемента я установил «4», а удалив элемент с индексом 2, 4 сместился бы, ведь насколько я знаю это преимущество списков, что при удалении дыр, как в массивах не остается. Ну вот, сместился бы 4 индекс на единицу влево и цикл бы отработал некорректно, да? Или нет?

Нахождение последнего элемента в стриме

Иногда возникает задача нахождения последнего элемента в стриме. Первый элемент можно получить с помощью метода findFirst, но как же найти последний?

Поиск последнего элемента

Для нахождения последнего элемента можно воспользоваться оператором reduce, который принимает на вход два элемента стрима и возвращает один:

public static T getLastElement(Stream stream) < return stream .reduce((e1, e2) ->e2) .orElse(null); >

В данном случае нам нужно всегда возвращать второй аргумент их двух переданных — и, в конце концов, мы получим на выходе последний элемент. Точнее, получим Optional, который может содержать элемент или быть пустым.

Исходный код

import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class GetLastElementInStream < public static void main(String[] args) < Listids = Arrays.asList("111", "222", "333", "444", "555", "666", "777"); System.out.println("Все элементы: " + ids); String lastElement = getLastElement(ids.stream()); System.out.println("Последний элемент: " + lastElement); > public static T getLastElement(Stream stream) < return stream .reduce((e1, e2) ->e2) .orElse(null); > >

Заключение

Для нахождения последнего элемента в стриме проще всего использовать метод reduce, который с каждой итерацией уменьшает количество элементов на 1 и в итоге мы получим последний оставшийся элемент стрима.

Нахождение последнего элемента в стриме

  • ← Поиск дубликатов в Stream
  • Нахождение первого элемента в стриме →

Как получить последний элемент потока в Java?

API Java Stream был основной функцией выпуска Java 8. Потоки представляют собой последовательности объектов с ленивой оценкой и предоставляют богатый, плавный и похожий на монадический API.

В этой статье мы кратко рассмотрим способы получения последнего элемента потока. Имейте в виду, что из-за природы потоков это не естественная операция . Всегда убедитесь, что вы не работаете с бесконечными потоками.

2. Использование API сокращения ​

Проще говоря, Reduce уменьшает набор элементов в потоке до одного элемента.

В этом случае мы уменьшим набор элементов, чтобы получить последний элемент в потоке. Имейте в виду, что этот метод будет возвращать детерминированные результаты только для последовательных потоков.

Давайте воспользуемся списком строковых значений , получим поток из списка и затем уменьшим:

 ListString> valueList = new ArrayList>();  valueList.add("Joe");  valueList.add("John");  valueList.add("Sean");    StreamString> stream = valueList.stream();  stream.reduce((first, second) -> second)   .orElse(null); 

Здесь поток сокращается до уровня, на котором остается только последний элемент. Если поток пуст, он вернет нулевое значение.

2. Использование функции пропуска​

Другой способ получить последний элемент потока — пропустить все элементы перед ним . Этого можно добиться с помощью функции Skip класса Stream . Имейте в виду, что в данном случае поток используется дважды, поэтому производительность заметно снижается .

Давайте создадим список строковых значений и используем его функцию размера , чтобы определить, сколько элементов нужно пропустить, чтобы достичь последнего элемента.

Вот пример кода, получающего последний элемент с помощью skip :

 ListString> valueList = new ArrayListString>();  valueList.add("Joe");  valueList.add("John");  valueList.add("Sean");    long count = valueList.stream().count();   StreamString> stream = valueList.stream();   stream.skip(count - 1).findFirst().get(); 

«Шон» оказывается последним элементом.

4. Получение последнего элемента бесконечного потока​

Попытка получить последний элемент бесконечного потока привела бы к бесконечной последовательности вычислений, выполняемых для бесконечных элементов. Как skip , так и reduce не вернутся из выполнения оценки, если мы не ограничим бесконечный поток определенным количеством элементов, используя операцию ограничения .

Вот пример кода, где мы взяли бесконечный поток и попытались получить последний элемент:

 StreamInteger> stream = Stream.iterate(0, i -> i + 1);  stream.reduce((first, second) -> second).orElse(null); 

Следовательно, поток не вернется из оценки и в конечном итоге остановит выполнение программы .

5. Вывод​

Мы видели разные способы получения последнего элемента потока как с помощью API сокращения , так и с помощью Skip . Мы также рассмотрели, почему это невозможно с бесконечными потоками.

Мы видели, что получить последний элемент из Stream непросто по сравнению с его извлечением из других структур данных. Это связано с ленивым характером потоков , которые не оцениваются, пока не будет вызвана терминальная функция, и мы никогда не узнаем, является ли текущий оцениваемый элемент последним.

Фрагменты кода можно найти на GitHub.

  • 1. Обзор
  • 2. Использование API сокращения
  • 2. Использование функции пропуска
  • 4. Получение последнего элемента бесконечного потока
  • 5. Вывод

Получаем последний элемент массива в JavaScript

Массив в JavaScript — это объект-контейнер, содержащий фиксированное количество значений одного типа. Длина массива, после его создания, останется постоянной. В данной статье мы рассмотрим различные методы доступа к последнему элементу массива.

Как получить последний элемент массива?

1 — Используем метод slice() массива для возврата определенного элемента.

2 — Извлекаем последний элемент, используя массив отрицательных индексов array.slice(-1).

3 — Сохраняем искомое значение в переменной.

Далее мы рассмотрим варианты реализации кода.

Использование свойства длины массива.

Свойство length возвращает количество элементов в массиве. Вычитание 1 из длины массива дает индекс последнего элемента массива, с помощью которого можно получить доступ к последнему элементу. Причина, по которой мы вычитаем 1 из длины, заключается в том, что в JavaScript нумерация индексов массива начинается с 0. т. е. индекс 1-го элемента будет равен 0. Поэтому индекс последнего элемента будет равен длине массива-1.

let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array[array.length — 1];

Использование метода slice().

Метод slice() возвращает определенные элементы из массива в виде нового объекта массива. Этот метод выбирает элементы, начинающиеся с заданного начального индекса и заканчивающиеся заданным конечным индексом, исключая элемент в конечном индексе. Метод slice() не изменяет существующий массив. Предоставление одного значения индекса возвращает элемент в этой позиции, а отрицательное значение индекса вычисляет индекс с конца массива.

let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array.slice(-1);

Использование метода pop().

Метод pop() извлекает/удаляет последний элемент массива и возвращает его. Этот метод изменяет длину массива.

let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array.pop();

Давайте теперь используем все три метода для массива, чтобы получить последний элемент и проверить, какой метод является самым быстрым:

let array = [2, 4, 6, 8, 10, 12, 14, 16];

console.time(‘array length property’);
let lastElem = array[array.length — 1];
console.log(lastElem);
console.timeEnd(‘array length property’);

console.time(‘array slice method’);
let lastElem1 = array.slice(-1);
console.log(lastElem1);
console.timeEnd(‘array slice method’);

console.time(‘array pop method’);
let lastElem2 = array.pop();
console.log(lastElem2);
console.timeEnd(‘array pop method’);

//16
//array length property: 7 ms
//[ 16 ]
//array slice method: 5 ms
//16
//array pop method: 2 ms

И как вы можете видеть, метод pop() является самым быстрым. Вы можете использовать его, если вас устраивает изменение массива. Если вы не хотите изменять массив, то используйте метод slice().

Создано 14.09.2021 09:42:02

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *