Sdscompany.ru

Компьютерный журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Циклический список java

Односвязный циклический список

Каждый узел однонаправленного (односвязного) циклического списка (ОЦС) содержит одно поле указателя на следующий узел. Поле указателя последнего узла содержит адрес корневого элемента.

Узел ОЦС можно представить в виде структуры, аналогичной односвязному линейному списку

Основные действия, производимые над элементами ОЦС:

  • Инициализация списка
  • Добавление узла в список
  • Удаление узла из списка
  • Вывод элементов списка
  • Взаимообмен двух узлов списка

Поскольку список является циклическим, реализация отдельной функции для удаления корня списка не требуется.

Инициализация ОЦС

Инициализация списка предназначена для создания корневого узла списка, у которого поле указателя на следующий элемент содержит адрес самого корневого элемента.

Добавление узла в ОЦС

Функция добавления узла в список принимает два аргумента:

  • Указатель на элемент, после которого происходит добавление
  • Данные для добавляемого элемента.

Процедуру добавления элемента можно отобразить следующей схемой:

Добавление элемента в ОЦС включает в себя следующие этапы:

  • создание добавляемого узла и заполнение его поля данных;
  • переустановка указателя узла, предшествующего добавляемому, на добавляемый узел;
  • установка указателя добавляемого узла на следующий узел (тот, на который указывал предшествующий узел).

Таким образом, функция добавления узла в ОЦС имеет вид, полностью аналогичный функции добавления узла в односвязный линейный список:

Возвращаемым значением функции является адрес добавленного узла.

Удаление узла ОЦС

В качестве аргументов функции удаления узла ОЦС передается указатель на удаляемый узел. Поскольку список циклический, нет необходимости передавать указатель на корень списка.

Функция возвращает указатель на узел, следующий за удаляемым.

Удаление узла может быть представлено следующей схемой:

Удаление узла ОЦС включает в себя следующие этапы:

  • установка указателя предыдущего узла на узел, следующий за удаляемым;
  • освобождение памяти удаляемого узла.

Вывод элементов ОЦС

Функция вывода элементов ОЦС аналогична функции для ОЛС за исключением условия окончания обхода элементов.
В качестве аргумента в функцию вывода элементов передается указатель на корень списка.
Функция осуществляет последовательный обход всех узлов с выводом их значений.

Для ОЦС также можно вызвать функцию вывода элементов списка начиная с любого узла.

Взаимообмен узлов ОЦС

В качестве аргументов функция взаимообмена ОЦС принимает два указателя за обмениваемые узлы, а также указатель на корень списка. Функция возвращает адрес корневого узла списка.

Взаимообмен узлов списка осуществляется путем переустановки указателей. Для этого необходимо определить предшествующий и последующий узлы для каждого заменяемого. При этом возможны две ситуации:

  • заменяемые узлы являются соседями;
  • заменяемые узлы не являются соседями, то есть между ними имеется хотя бы один элемент.

При замене соседних узлов переустановка указателей выглядит следующим образом:

При замене узлов, не являющихся соседними переустановка указателей выглядит следующим образом:

При переустановке указателей необходимость в проверке корневого узла отсутствует (в отличие от аналогичной функции для ОЛС).

Функция взаимообмена узлов списка выглядит следующим образом:

Односвязный циклический список с выделенной головой

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

Нужно лишь подсказать, а лучше показать, как сделать его. Пару методов по типу добавление, добавление по индексу, добавление в конец и удаление.
Буду очень благодарен за помощь.

Всё делается в рамках вот этих Классов.

Есть прекрасная статья, где всё реализовано на С++:
https://prog-cpp.ru/data-ocs/
Но она на C++.

Добавлено через 16 минут
Так же есть диаграмма, если это как-то поможет разобраться в проблеме.https://pp.userapi.com/c850136/v850136867/1219fc/6Kgl5sicIrc.jpg

Односвязный список
Здравствуйте, хочу разработать односвязный список. Реализовать методы добавить, удалить и прочие.

Односвязный список
Доброго времени суток друзья.Нужна помощь по реализации метода по "вставки" в конец односвязного.

Односвязный список
Создал список. Каждый элемент содержит id и указатель на следующий элемент. Для вывода списка на.

Односвязный список
Написал односвязный список. Хранит только первый элемент, "цеплять" следующие элементы.

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

Добавлено через 5 минут
а где класс DebitAccount?

Добавлено через 1 минуту
Эти классы, представленные выше, ты сам написал или даны по заданию?

К сожалению я не нашёл ни одного. Был бы рад найти, я не от балды создал эту тему. Был бы рад, если бы вы дали ссылку на эти темы. Тогда было бы одной бесполезной и аналогичной темой меньше.

Добавлено через 1 минуту

Решение

подожди чуть, список я тебе скину сюда. У меня двусязный циклический есть. переделываю на односвязный

Добавлено через 19 минут

Добавлено через 31 секунду
вывод:

. Опробую, если что отпишусь.

измени вот этот метод:

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Задание на односвязный список
Реализован класс List<T> на основе односвязного списка. Необходимо в данном классе реализовать.

Односвязный и двусвязный список
Здравствуйте, мне необходимо реализовать структуру данных "Список" (односвязный и двусвязный). До.

Линейный односвязный список
Надо разработать консольное приложение на Java Данные приложения – линейный односвязный список.

Односвязный список двусвязных списков
Программа симулирует создание поездов. Каждый поезд состоит из тягача и вагонов. Для того.

Структурирование данных с помощью JavaScript: Односвязные и двусвязные списки


Одними из основных структур данных, рассматриваемых в информатике, являются односвязные и двусвязные списки.

Когда мы проходили эти структуры, я попросил своих однокурсников привести мне несколько примеров, которые бы отражали суть этих списков. Они привели такие аналогии, как список бакалейных товаров и нумерация вагонов поезда. Эти примеры, как я позже узнал, являлись неточными. Список бакалейных товаров более похож на очередь, а вагоны поезда на массив.

Односвязный список

В информатике односвязный список представляет собой структуру данных, которая содержит последовательность связанных узлов. Каждый узел содержит данные и указатель, который может указывать на другой узел.

Узлы односвязного списка очень похожи на этапы игры « Охота за сокровищами «. Каждый этап содержит сообщение ( например, «Вы достигли Франции» ) и указатели на следующий этап ( например, «Посетите эти координаты широты и долготы» ).

Операции с односвязными списками

Можно выделить такие основные операции с односвязными списками: Node и SinglyList .

  • data — здесь хранятся значения;
  • next — указывает на следующий узел в списке.

SinglyList

  • _length — извлекает количество узлов в списке;.
  • head — определяет узел, как головной элемент списка;
  • add(value) — добавляет в список узел;
  • searchNodeAt(position) — ищет в списке узел на n-ной позиции;
  • remove(position) — удаляет узел из списка.

Реализация односвязных списков

Для конкретного примера реализации мы сначала определим конструктор с именем Node , а затем конструктор с именем SinglyList . Каждый экземпляр узла должен « уметь » хранить данные и указывать на другой узел. Чтобы добавить эти функции, мы создадим два свойства: data и next , соответственно:

Далее, мы должны определить SinglyList :

Каждый экземпляр SinglyList будет иметь два свойства: _length и head . Первое устанавливает число узлов в списке; второй — указывает на головной элемент списка ( узел в начале списка ). Так как каждый новый экземпляр SinglyList не содержит узла, то значение по умолчанию для head и для _length будет null .

Методы односвязных списков

Нам нужно определить методы, с помощью которых можно добавлять, искать и удалять узлы из списка. Начнем с добавления узла.

Метод add(value)

Теперь реализуем функционал для добавления узлов в список:

Добавление узла в список включает в себя множество этапов. Мы используем аргумент для add(value) , чтобы создать новый экземпляр Node , который присваивается переменной с именем node . Мы также объявляем переменную с именем currentNode и инициализируем ее в _head нашего списка. Если в списке нет узлов, тогда значение head будет null .

После этого мы обрабатываем в коде два возможных случая. В первом случае рассматривается добавление узла в пустой список. Если head не указывают на узел, тогда node назначается головным элементом списка, длина списка увеличивается на один узел, и возвращается node.

Читать еще:  Ошибка дел в эксель

Во втором случае рассматривается добавление узла в непустой список. Мы входим в цикл while , и во время каждой итерации проверяем, указывает ли currentNode.next на другой узел. Во время первой итерации currentNode всегда указывает на головной элемент списка.

Если нет, мы назначаем для currentNode.next — node и возвращаем node .

Если ответ да, мы входим в тело цикла while . В теле цикла мы переопределяем currentNode как currentNode.next до тех пор, пока currentNode.next не перестанет указывать на другой узел. Другими словами, currentNode указывает на последний узел списка.

Цикл while разрывается. И в конце мы назначаем для currentNode.next — node , увеличиваем _length на один элемент, а затем возвращаем node.

Метод searchNodeAt(position)

Теперь мы можем добавлять узлы в список, но не можем производить поиск узлов на определенной позиции в списке. Для этого создадим метод с именем searchNodeAt(position) , который принимает аргумент с именем position . Этот аргумент должен быть целым числом, которое указывает на узел на n -ной позиции в списке:

Оператор if проверяет на соответствие первому случаю: в качестве аргумента передается неверная позиция.

Если индекс, переданный в searchNodeAt(position) , верен, тогда мы переходим ко второму случаю — циклу while . Во время каждой итерации цикла while , currentNode , который сначала всегда указывает на head , переназначается, как следующий узел в списке до тех пор, пока количество итераций не станет равно индексу позиции. Тогда цикл разрывается, и возвращается currentNode .

Метод remove(position)

Последний метод, который мы создадим, называется remove(position) :

Реализация remove(position) включает в себя три возможных варианта:

  1. В качестве аргумента передается неверная позиция;
  2. В качестве аргумента передается первая позиция (head списка) ;
  3. В качестве аргумента передается существующая (не первая) позиция.

Первый и второй варианты являются самыми простыми. По первому сценарию, если список пуст или была передана несуществующая позиция, выдается ошибка.

При втором случае обрабатывается удаление первого узла в списке, который также является head . Если это так, то применяется следующая логика:

  1. head устанавливается в currentNode.next ;
  2. deletedNode указывает на currentNode ;
  3. currentNode устанавливается в null ;
  4. _length списка уменьшается на один;
  5. Возвращается deletedNode .

Третий сценарий самый трудный для понимания. Эта сложность возникает из-за необходимости отслеживания двух узлов во время каждой итерации цикла while . Во время каждой итерации цикла мы отслеживаем элемент, находящийся перед узлом, который должен быть удален, и элемент, который должен быть удален. Когда While достигает позиции узла, который мы хотим удалить, цикл завершается.

К этому моменту мы учитываем ссылки на три узла: beforeNodeToDelete , nodeToDelete и deletedNode . Перед тем как удалить nodeToDelete , мы должны установить его значение next следующему значению beforeNodeToDelete . Если вы не до конца понимаете, в чем цель этого действия, вспомните, что у нас есть список связанных узлов; удаление любого узла разрушает связь, которая должна быть непрерывной от первого узла в списке до последнего.

Далее мы присваиваем значение deletedNode в nodeToDelete . Затем мы устанавливаем значение nodeToDelete на null , уменьшаем длину списка на один элемент и возвращаем deletedNode .

Полная реализация односвязного списка

Полная реализация нашего списка выглядит следующим образом:

От односвязных к двусвязным

Мы завершили реализацию односвязного списка. Теперь мы можем использовать структуру данных, которая добавляет, удаляет и ищет в списке узлы, которые располагаются не на смежных позициях.

Сейчас все наши операции стартуют с начала списка и продвигаются дальше к концу. Другими словами, они являются однонаправленными.

Двусвязный список

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

Операции двусвязных списков

Наш список будет включать в себя два конструктора: Node и DoublyList . Возможные операции:

  • data — здесь хранятся значения;
  • next — указывает на следующий узел в списке;
  • previous — указывает на предыдущий узел в списке.

DoublyList

  • _length — извлекает количество узлов в списке;
  • head — назначает узел в качестве головного элемента списка;
  • tail — назначает узел в качестве конечного элемента списка;
  • add(value) — добавляет узел в список;
  • searchNodeAt(position) — ищет узел на n-ной позиции в списке;
  • remove(position) — удаляет узел из списка.

Реализация двусвязного списка

Для реализации мы создадим конструктор с именем Node :

Для создания двунаправленной обработки двусвязного списка нам нужны свойства, которые указывают в двух направлениях. Эти свойства мы назовем previous и next .

Далее нам необходимо реализовать DoublyList и добавить три свойства: _length , head и tail . В отличие от односвязного, двусвязный список содержит ссылку, как на начало, так и на конец списка. Так как каждый экземпляр DoublyList изначально создается без узлов, то значения по умолчанию для head и tail будут установлены на null :[/HTML]

Методы двусвязного списка

Рассмотрим следующие методы: add(value) , remove(position) и searchNodeAt(position) . Все эти методы мы использовали для односвязного списка, но теперь их нужно переписать для двунаправленной обработки.

Метод add(value)

В этом методе у нас реализованы два сценария. Во-первых, если список пуст, тогда в качестве head и tail мы назначаем добавляемый узел. Во-вторых, если список содержит узлы, тогда мы находим конечный элемент и устанавливаем добавляемый узел в качестве tail.next . Также нам нужно задать для нового конечного элемента двунаправленную обработку. Другими словами, нам необходимо установить первоначальный конечный элемент в качестве tail.previous .

Метод searchNodeAt(position)

Реализация searchNodeAt(position) идентична односвязному списку:

Метод remove(position)

Этот метод наиболее сложный для понимания. Я сначала приведу код, а затем поясню его:

remove(position) обрабатывает четыре возможных случая:

  1. Позиция, передаваемая в качестве аргумента remove(position) , не существует. В этом случае, мы выдаем ошибку;
  2. Позиция, передаваемая в качестве аргумента remove(position) , является первым узлом (head) списка. Если это так, то мы устанавливаем head в качестве deletedNode , а затем в качестве head назначаем следующий узел в списке. Далее мы должны проверить, содержит ли наш список более одного узла. Если нет, то head будет установлен на null и мы переходим к части if оператора if-else . В теле if мы также должны установить tail на null . Таким образом, мы возвращаем список в исходное состояние пустого двусвязного списка. Если мы удаляем первый узел в списке и у нас остается более одного узла, то мы входим в раздел else оператора if-else . В этом случае мы устанавливаем свойство previous для head на null , потому что у нас нет узлов перед головным элементом списка;
  3. Позиция, передаваемая в качестве аргумента remove(position) , является конечным элементом списка. Во-первых, tail устанавливается в качестве deletedNode . Во-вторых, в качестве tail переустанавливается узел, расположенный перед конечным элементом списка. В-третьих, после нового конечного элемента не будет узлов, расположенных после него, и его свойство next должно быть равно null ;
  4. Мы разрываем цикл while , как только currentNode указывает на узел, расположенный в позиции, передаваемой в качестве аргумента remove(position) . После этого мы переназначаем значение beforeNodeToDelete.next на узел, расположенный после nodeToDelete и, наоборот, мы переназначаем значение afterNodeToDelete.previous на узел, расположенный перед nodeToDelete . Другими словами, мы убираем ссылки на удаленный узел и переназначаем их на правильные узлы. Далее мы устанавливаем nodeToDelete в качестве значения deletedNode . Затем мы устанавливаем значение nodeToDelete на null .

В конце мы уменьшаем длину списка и возвращаем deletedNode .

Полная реализация двусвязного списка

Вот полная реализация:

Заключение

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

Данная публикация представляет собой перевод статьи « Data Structures With JavaScript: Singly-Linked List and Doubly-Linked List » , подготовленной дружной командой проекта Интернет-технологии.ру

Двунаправленный циклический связанный список

Я программист на C ++, изучающий Java в рамках подготовки к классу ООП этой осенью. Это говорит о том, что Java для меня довольно новичок, поэтому мне хотелось бы услышать отзывы о том, как улучшить этот код.

  • Код работает как ожидалось и портирован из моего эквивалентного кода на C ++, который я написал некоторое время назад.
  • Не все операции, выполняемые должны , были реализованы (поиск, удаление и т. д.). Конечно, это было бы более подходящим для BST или других структур данных для эффективности.
Читать еще:  Ошибка сертификата explorer

node.java

List.java

3 ответа

Соглашение о стиле Java

Одно из первых, что вы должны сделать, работая на новом языке, — это взглянуть на соглашение о стиле. Вы использовали соглашение C ++, а не Java. Имя класса должно быть PascalCase, а имя метода — camelCase. Если это не константа, вы не должны использовать _ (за исключением некоторого точного случая).

else должен быть на той же строке, что и последний > .

Объявление переменной

Мне всегда нравится запускать класс с переменными класса и экземпляра. Это даст мне знать, что мой класс использует. Так что private node head; должен быть перед конструктором.

Я бы предположил, что вы избегаете использования отдельных букв в качестве имени переменной. Чтение x и p не помогает знать, для чего он используется. Попробуйте использовать описательное имя, ограничение длины или почти не ограничено, поэтому будьте творческими!

Документация

Я вижу, что у вас есть хорошие комментарии для ваших методов public . Я бы предположил, что вы используете JavaDoc. Это почти ничего не изменит, просто некоторые синтаксические изменения. Вот один пример JavaDoc:

Как показано в комментариях к @ tot2, вы можете использовать инструменты, которые будут генерировать html из вашего Javadoc. Если вы проверите документацию Java 7 html, все это будет построено с ней. Это полезно, если вы используете среду IDE, поскольку она легко доступна при кодировании. В Eclipse, если вы наведете курсор мыши на метод /класс, он покажет вам Javadoc в хорошо представленном виде. Если вы хотите получить дополнительную информацию, я предлагаю вам посетить эту страницу Oracle .

кронштейн

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

Это будет «экономить» ваше время, если вам нужно добавить новую строку кода в части if . Это также предотвратит столь странную ошибку, если кто-то попытается добавить строку, но забудьте, что скобок нет.

В то время как Marc-Andre уже много говорил о соглашениях стиля Java, вот мои 2 цента в вашей реализации.

Вы создали List . В Java принято реализовывать интерфейсы, если у вас есть классы с похожими примерами использования и методами.

Это должно быть /может быть:

Нейминг:

Я предлагаю вам изменить название своей реализации, чтобы избежать конфуции. Java уже поставляется с двумя списками ((интерфейс) java.util.List и (class) java.awt.List ), которые только что названы List, вам действительно не нужно вводить третий;)

Кстати, если вы реализуете интерфейс, вам необходимо переопределить методы, которые ему заданы. С>

В случае List это довольно много, включая, но не ограничиваясь:

При их внедрении обязательно используйте аннотацию @Override :

Это подводит меня к следующему пункту:

Скрытие внутренних классов:

Абсолютно нет необходимости показывать, как ваш список работает внутри, выставляя класс узла всем, кто получил ваш список.

Вместо этого в Java вы можете использовать функцию «Внутренние классы». Это довольно просто:

Я использую несколько трюков здесь:
Первое, что вы, вероятно, заметили, — это ключевое слово final . В случае, если вы еще не слышали об этом: компилятор устанавливает, что конечной переменной присваивается только один раз. Это позволяет мне создать экземпляр Node одноразовый. Если вы хотите изменить элемент, вам придется заменить его на новый узел.

Помните, что это не препятствует изменениям самих объектов. Это очень возможно:

Другое дело, что я инициализирую next и previous не в конструкторе. Это мое личное предпочтение!

Кроме того, внутренний класс является статическим. Это предотвращает доступ из внутреннего класса к внешнему при использовании this . Для получения дополнительной информации см. этот CR- Ответ.

Пока мы находимся в конструкторах /инициализации:

Консистенция:

Одна большая проблема, которую я вижу с вашим кодом, заключается в том, что вы не работаете последовательно:

Здесь вы используете довольно микс. В конструкторе Node вы используете сеттеры — даже с ключевым словом this — для создания вашего узла, в вашем списке вы делаете это напрямую — и без this — в поле.

Хотя оба могут быть законными, я лично предпочитаю использовать средний путь. Как вы видели в приведенном выше коде, я обычно инициализирую поля, используя this , но не методы setter. В случае равных имен требуется использовать this , поэтому я обычно помещаю его везде.

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

Здесь я советую по возможности использовать второй подход. Один оператор имеет одну строку, а одна строка имеет одно (или нет) утверждение.

Хотя это не дублированный поток, есть интересный поток, обсуждающий круговые списки, с более простым подходом, чем начинать с нуля:

Он показывает простое расширение класса ArrayList и применение шаблона декоратора. по существу, все, что вам нужно сделать, это вернуть индекс, на который ссылается модуль (с использованием размера ArrayList) требуемого индекса, и это будет иметь циклическое поведение. Однако это взлом действительно, а не настоящий круговой список, где последний элемент содержит ссылку на первый элемент. Одна из возможностей, которую я не видел, — это просто реализовать интерфейс Iterable, чтобы вести себя круговым образом, это, по-видимому, идеальное развязанное решение, и оно возвращает Iterator, гораздо более зрелый подход. Это имеет то преимущество, что несколько итераторов присутствуют в одном списке.

Списки на Java — методы интерфейса List

Интерфейс Java List, java.util.List, представляет упорядоченную последовательность объектов. Элементы, содержащиеся в списке Java, вставлять и удалять в соответствии с порядком их появления в списке.

Каждый элемент в списке Java имеет индекс. Первый элемент в имеет индекс 0, второй элемент имеет индекс 1 и т.д.

Вы можете добавить любой объект в список. Если список не типизирован с использованием Java Generics, то вы можете даже смешивать объекты разных типов (классов) в одном и том же списке.

Java List — это стандартный интерфейс, который является подтипом Java Collection, что означает, что означает, что List наследуется от Collection.

Учебное видео по спискам Java

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

Java List и Set

Java List и Java Set очень похожи в том, что они оба представляют коллекцию элементов. Тем не менее, есть некоторые существенные различия.

Первое различие между Java List и Java Set состоит в том, что один и тот же элемент может встречаться в списке более одного раза. Это отличается от набора, где каждый элемент может встречаться только один раз.

Второе различие — элементы в List имеют порядок, и элементы могут повторяться в этом порядке. Набор не предполагает порядок элементов, хранящихся внутри.

Реализация List

Будучи подтипом Collection, все методы в интерфейсе Collection также доступны в Listinterface.

Поскольку List — это интерфейс, вам необходимо создать конкретную реализацию интерфейса, чтобы использовать его. Вы можете выбирать между следующими реализациями List в API коллекций Java:

  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.Stack

Также есть параллельные реализации List в пакете java.util.concurrent.

Вот несколько примеров того, как создать экземпляр List:

Как вставить элементы в список Java

Вставить элементы (объекты) в список Java можно методом add (). Вот пример добавления элементов в список Java:

Первые три вызова add () добавляют экземпляр String в конец списка.

Вставить нулевые значения

На самом деле возможно вставить даже нулевые значения в список.

Добавить элементы по определенному индексу

Можно добавить элемент в список по определенному индексу. Интерфейс List имеет версию метода add(), которая принимает индекс в качестве первого параметра, и элемент для вставки в качестве второго параметра. Вот пример вставки элемента с индексом 0.

Читать еще:  Java web service example

Если список уже содержит элементы, то теперь они будут перемещаться дальше во внутренней последовательности. Элемент, который имел индекс 0 до того, как новый элемент был вставлен в индекс 0, будет перемещен в индекс 1 и т.д.

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

Можно добавить все элементы из одного списка в другой. Сделаем это с помощью метода ListaddAll (). Результат представляет собой объединение двух списков.

Этот пример добавляет все элементы из listSource в listDest.

Метод addAll () принимает набор в качестве параметра, поэтому в качестве параметра можно передать список или набор.

Получить элементы из списка Java

Вы можете получить элементы из списка Java, используя индекс элементов. Методом get (int index). Вот пример доступа к элементам списка с использованием индексов элементов:

Также возможно итерировать элементы списка в том порядке, в котором они хранятся внутри.

Как найти элементы в списке Java

Вы можете найти элементы в списке Java, используя один из этих двух методов:

  1. index()
  2. LastIndexOf ()Метод indexOf () находит индекс первого вхождения в списке заданного элемента.

Запуск этого кода приведет к следующему результату:

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

Метод lastIndexOf () находит индекс последнего вхождения в списке данного элемента.

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

Элемент 1 встречается 2 раза. Индекс последнего равен 2.

Проверка: содержит ли список элемент?

Вы можете проверить, содержит ли Java List данный элемент, используя метод List contains ().

Чтобы определить, содержит ли List этот элемент, List будет внутренне выполнять итерации своих элементов и сравнивать каждый элемент с объектом, переданным в качестве параметра.

Поскольку можно добавить нулевые значения в список, фактически можно проверить, содержит ли список нулевое значение.

Очевидно, что если входной параметр для contains () имеет значение null, метод contains () не будет использовать метод equals() для сравнения с каждым элементом, а вместо этого использует оператор ==.

Как удалить элементы из списка Java

Вы можете удалить элементы из списка Java с помощью этих двух методов:

  • remove(Object element)
  • remove(int index)

remove (Object element) удаляет элемент в списке, если он присутствует. Все последующие элементы, затем перемещаются вверх по списку. Таким образом, их индекс уменьшается на 1.

Этот пример сначала добавляет элемент, а затем снова удаляет его.

Метод List remove (int index) удаляет элемент по указанному индексу.

После выполнения этого примера кода список будет содержать элементы 1 и 2 с индексами 0 и 1.

Очистить список

Интерфейс Java List содержит метод clear (), который удаляет все элементы из списка при вызове. Удаление всех элементов также называется очисткой.

Как сохранить все элементы из одного списка в другом

Метод retainAll () способен сохранять все элементы из одного списка в другом. Другими словами, метод retain () удаляет все элементы, которые не найдены в другом списке.

Результатом является пересечение двух списков.

Узнать количество элементов

Вы можете получить количество элементов вызвав метод size (). Вот пример:

Подсписок списка

Метод subList () может создавать новый List с подмножеством элементов из исходного List.

Метод subList () принимает 2 параметра: начальный индекс и конечный индекс. Начальный индекс — это индекс первого элемента из исходного списка для включения в подсписок.

Конечный индекс является последним индексом подсписка, но элемент в последнем индексе не включается в подсписок. Это похоже на то, как работает метод подстроки Java String.

После выполнения list.subList (1,3) подсписок будет содержать элементы с индексами 1 и 2.

Помните, что исходный список содержит 4 элемента с индексами от 0 до 3. Вызов list.subList (1,3) будет включить индекс 1, но исключить индекс 3, сохраняя тем самым элементы с индексами 1 и 2.

Преобразовать list в set

Вы можете преобразовать список Java в набор(set), создав новый набор и добавив в него все элементы из списка. Набор удалит все дубликаты.

Таким образом, результирующий набор будет содержать все элементы списка, но только один раз.

Обратите внимание, что список содержит элемент String 3 два раза. Набор будет содержать эту строку только один раз. Таким образом, результирующий набор будет содержать строки: element 1 , element 2 and element 3 .

Общие списки

По умолчанию вы можете поместить любой объект в список, но Java позволяет ограничить типы объектов, которые вы можете вставить в список.

Этот список теперь может содержать только экземпляры MyObject. Затем вы можете получить доступ к итерации его элементов без их приведения.

Сортировка

Вы можете отсортировать список с помощью метода Collections sort ().

Если Список содержит объекты, которые реализуют интерфейс Comparable (java.lang.Comparable), тогда эти объекты можно сравнивать. В этом случае вы можете отсортировать список следующим образом:

Класс Java String реализует интерфейс Comparable, вы можете отсортировать их в естественном порядке, используя метод Collections sort ().

Сортировка списка с помощью Comparatorimplementation

Если объекты не реализуют интерфейс Comparable или если вы хотите отсортировать объекты в порядке, отличном от их реализации compare (), вам необходимо использовать Comparatorimplementation (java.util.Comparator).

Вот код сортировки:

Обратите внимание на реализацию Comparator в приведенном выше примере. Эта реализация сравнивает только поле марки автомобилей Car. Можно создать другую реализацию Comparator, которая сравнивает номерные знаки или даже количество дверей в автомобилях.

Возможно реализовать Comparator с использованием Java Lambda. Вот пример, который сортирует объекты List of Car с использованием трех различных реализаций интерфейса Comparator, каждая из которых сравнивает экземпляры Car по своему полю:

Итерации

Вы можете выполнить итерацию списка несколькими различными способами. Три наиболее распространенных способа:

  • Использование итератора
  • Использование цикла for-each
  • Использование цикла for
  • Использование API Java Stream

Итерация списка с помощью итератора

Первый способ итерации списка — использовать итератор Java.

Вызывая метод iterator () интерфейса List.

Вызов hasNext () выполняется внутри цикла while.

Внутри цикла while вы вызываете метод Iterator next () для получения следующего элемента, на который указывает Iterator.

Если список задан с использованием Java Generics, вы можете сохранить некоторые объекты внутри цикла while.

Итерация списка с использованием цикла For-Each

Второй способ итерации List — использовать цикл for.

Цикл for выполняется один раз для каждого элемента. Внутри цикла for каждый элемент, в свою очередь, связан с переменной obj.

Можно изменить тип переменной внутри цикла for.

Итерация списка с помощью цикла For

Третий способ итерации List — использовать стандартный цикл for, подобный следующему:

Цикл for создает переменную int и инициализирует ее 0. Затем она зацикливается, пока переменная int i меньше размера списка. Для каждой итерации переменная i увеличивается.

Внутри цикла for обращаемся к элементам List с помощью метода get (), передавая в качестве параметра переменную i.

Опять же, если список напечатан с использованием Java Generics, например, для для строки, то вы можете использовать универсальный тип списка в качестве типа для локальной переменной, которая присваивается каждому элементу списка во время итерации.

Тип локальной переменной внутри цикла for теперь String. Поскольку список обычно типизируется как String, он может содержать только объекты String.

Следовательно, компилятор знает, что только метод String может быть возвращен из метода get (). Поэтому вам не нужно приводить элемент, возвращенный get (), в String.

Перебор списка с использованием API Java Stream

Четвертый способ итерации через API Java Stream. Для итерации вы должны сначала получить поток из списка. Получение потока из списка в Java выполняется путем вызова метода Liststream ().

Как только вы получили поток из списка, вы можете выполнить итерацию потока, вызвав его метод forEach ().

Вызов метода forEach () заставит Stream выполнить внутреннюю итерацию всех элементов потока.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Ссылка на основную публикацию
Adblock
detector