Java. Об Iterator и Iterable c примерами.

Поділитися
Вставка
  • Опубліковано 21 вер 2024
  • В данном видео объясняется что такое паттерн Iterator и интерфейс Iterable в языке программирования Java. На примерах показывается для чего нужен Iterator и как его использовать. Рассматривается так же вопрос удаления и вставки элементов в LinkedList за константное время.
    Исходники для видео:
    github.com/Arh...
    Поддержать канал💰:
    yoomoney.ru/to...
    Наша группа в Telegram:
    t.me/ArhiTutor...
    #ArhiTutorialsJava #ityoutubersru

КОМЕНТАРІ • 69

  • @silendor6936
    @silendor6936 2 роки тому +15

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

  • @akemi_yori
    @akemi_yori 2 роки тому +8

    Ценю ваши видео за то, что рассказываете суть языка и всякие подводные камешки, очень полезно!

  • @shaporen
    @shaporen 3 місяці тому

    Сергей, большая вам благодарность! Вы очень четко, последовательно и понятно объясняете материал! Успехов вам во всем!

  • @oleg12395
    @oleg12395 2 роки тому +8

    Дай Бог тебе здоровья! Классно объяснил 👌

  • @artyomlosev1608
    @artyomlosev1608 2 роки тому +5

    Спасибо большое помогли разложить все по полочкам! Почему-то в книгах уделяют нексолько строк или совсем пропускают тему итератора. А штука то важная)) Как раз искал пример применения вне коллекции.

  • @eskelgarsio2998
    @eskelgarsio2998 2 роки тому +7

    Спасибо за видео! Понятно объясняешь!

  • @yushchenkoalexey
    @yushchenkoalexey 2 роки тому +2

    Сергей, спасибо! Прекрасные видео. Отблагодарил по ссылочке, как смог ;)

    • @arhitutorials
      @arhitutorials  2 роки тому

      Получил. Большое спасибо!

  • @The_Vict0r
    @The_Vict0r Рік тому +1

    Отлично! Как всегда полезно и по существу. Отдельно порадовал метод "Ад" ))

  • @olegliakhovets8224
    @olegliakhovets8224 2 роки тому +5

    Как всегда - очень интересно! Спасибо!

  • @konstantinvyazovchenko9451
    @konstantinvyazovchenko9451 2 роки тому

    Сергей спасибо, минимум воды, максимум по делу.

  • @svalyavasvalyava9867
    @svalyavasvalyava9867 2 роки тому +3

    спасибо за весь труд, вложенный в видео

  • @oleksii_shtanko
    @oleksii_shtanko 2 роки тому +4

    Спасибо большое, хороший разбор

  • @bilbojke1834
    @bilbojke1834 Рік тому +1

    Отличное объяснение! Спасибо!

  • @vollyyaa
    @vollyyaa 2 роки тому +1

    Спасибо за четкое и понятное объяснение)

  • @hetken_in_sorrow
    @hetken_in_sorrow 4 місяці тому

    Спасибо за наглядность.

  • @flyingdreamer7149
    @flyingdreamer7149 2 роки тому +1

    Спасибо большое за видео!

  • @auratarus
    @auratarus 2 роки тому +1

    супер просто и понятно! спасибо

  • @cwnik
    @cwnik 2 роки тому +1

    Полезная информация👍

  • @rooky2me
    @rooky2me 2 роки тому +1

    ты реально крут :) Tnx!

  • @RuslanCherryMissing
    @RuslanCherryMissing Рік тому

    Офигенно объяснил! Спасибо!

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil Рік тому

    Спасибо, полезные примеры

  • @АлексейБуяновский-ь6б

    большое спасибо, доходчиво объяснили!

  • @mksmsmirnov
    @mksmsmirnov Рік тому

    Спасибо за урок.

  • @mr_owls404
    @mr_owls404 2 роки тому +1

    Спасибо!☺

  • @AibekDandaev
    @AibekDandaev 2 місяці тому

    11:30
    In the for-each loop within the provided code, the second place (after the colon :) is occupied by the collection or iterable object that is being iterated over. In this specific example, it is Range.fromTo(0, 7). This call returns an instance of the Range class, which is an iterable that provides a sequence of integers from 0 to 7.
    таким образом, во второй части косвенно вызывается создание объекта, реализующего интерфейс Iterable ,
    строка "𝚛𝚎𝚝𝚞𝚛𝚗 𝚗𝚎𝚠 𝚁𝚊𝚗𝚐𝚎(𝚏𝚛𝚘𝚖, 𝚝𝚘);" вызывает конструктор класса 𝚁𝚊𝚗𝚐𝚎
    𝚙𝚞𝚋𝚕𝚒𝚌 𝚜𝚝𝚊𝚝𝚒𝚌 𝚁𝚊𝚗𝚐𝚎 𝚏𝚛𝚘𝚖𝚃𝚘(𝚒𝚗𝚝 𝚏𝚛𝚘𝚖, 𝚒𝚗𝚝 𝚝𝚘) {
    𝚛𝚎𝚝𝚞𝚛𝚗 𝚗𝚎𝚠 𝚁𝚊𝚗𝚐𝚎(𝚏𝚛𝚘𝚖, 𝚝𝚘);
    }
    соответственно, на втором месте должен обязательно стоять объект класса, реализующего интерфейс Iterable, или же массив (может даже примитивных типов данных таких как: int, double, short и т.д.)

  • @musamuradzade1606
    @musamuradzade1606 Рік тому

    спасибо, очень полезная инфа)

  • @alexrychkoff7603
    @alexrychkoff7603 Рік тому

    Круто всё объясняешь красавец

  • @cakeistrue
    @cakeistrue Рік тому

    Спасибо большое

  • @Mike-kb6vl
    @Mike-kb6vl Рік тому +2

    мораль - всегда юзайте ArrayList

  • @АнтонДомостроев
    @АнтонДомостроев 2 роки тому

    Супер!!

  • @MikhailBezhaneishvili
    @MikhailBezhaneishvili 7 місяців тому

    Красавчик!!!

  • @RuslanCherryMissing
    @RuslanCherryMissing Рік тому

    Подписка!

  • @ЕкатеринаРудопасТкаченко

    Спасибо

  • @phello57
    @phello57 Місяць тому

    не согласен на счет, что цикл( который по .get() ) по линкед листу это линейная, там будет квадратичная, потому что он начинает с головы и вынужден каждую итерацию искать iый элемент заного. Для линейной нужно создать переменную с сылкой на прошлую ноду

  • @ОлегФадеев-х7д
    @ОлегФадеев-х7д 2 роки тому

    Чувствую скоро будет компаратор и стримы))

    • @arhitutorials
      @arhitutorials  2 роки тому

      Про компаратор уже есть:
      ua-cam.com/video/hqIXm7Ontdg/v-deo.html
      Про стримы хочется что-нибудь оригинальное придумать, но пока идей нет. А просто повторять то, что сказано в документации, смысла не вижу.

  • @soulgambler961
    @soulgambler961 Рік тому

    Спасибо, очень помогает на старте :)

  • @ТаримЗиямов
    @ТаримЗиямов 2 роки тому +1

    Все круто, а зачем Iterable отдельно нужен? Можно же обойтись только Iterator и его реализовывать или я не прав?

    • @arhitutorials
      @arhitutorials  2 роки тому

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

  • @BogdanovArtemiy
    @BogdanovArtemiy 2 роки тому +1

    Имели ввиду нет быстрого удаления в LinkedList? 6:13

    • @maxchatsky2898
      @maxchatsky2898 2 роки тому

      Так оно и есть. Удалить быстрее, чем в дефолтной имплементации ArrayList "удалили-сдвинули", даже итератору не под силу)

  • @igorsubbotin4791
    @igorsubbotin4791 Рік тому

    6:50 после создания итератора до первого вызова next() итератор не указывает ни на какой элемент? И после первого вызова next() у нас появляется доступ к первому элементу, не ко второму?

  • @______________9358
    @______________9358 2 роки тому +1

    У меня такой вопрос.Вот вы говорите(и везде так написано) ,что удаление элемента в LinkedList происходит за константное время с помощью итератора,но итератор же ходит по всем элементам,т.е. чем много элементов ,тем много времени требуется для нахождении и удалении,никак не могу понять этот момент,не могли бы объяснить???

    • @arhitutorials
      @arhitutorials  2 роки тому

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

    • @______________9358
      @______________9358 2 роки тому

      @@arhitutorials Спасибо за ответ.) Да ,я это понимаю,но если судить строго по Big O, то получается O(n)? Просто куда не смотришь везде говорится что удаление и ставка происходит за константное время (или может просто не учитывается время нахождения )

    • @arhitutorials
      @arhitutorials  2 роки тому +3

      @@______________9358 Не учитывается время нахождения.
      Если, например, нужно удалить из списка все элементы, которые больше некоторого X, то будет один проход, вся операция будет займет O(n), удаление каждого отдельного элемента в ней - O(1).

    • @______________9358
      @______________9358 2 роки тому

      @@arhitutorials спасибо большое!

    • @artyomlosev1608
      @artyomlosev1608 2 роки тому

      @@arhitutorials Спасибо большое! У меня был такой же вопрос, разобрался.

  • @ДЖИГЛИПУФ-р3ч
    @ДЖИГЛИПУФ-р3ч Рік тому

    Может кто подробнее объяснить почему итератор быстрее перебирает элементы в связанном списке?

  • @ElChampi0
    @ElChampi0 Рік тому +1

    Сам метод remove() работает за константное время, но переборка то все равно линейная, так что все равно задача по удалению элемента имеет линейную сложность

  • @Mansurov1991
    @Mansurov1991 Рік тому

    Правильно ли я понимаю, что при проходе по LinkedList циклом for(i)(не for(each)), то обращение к каждому элементу O(n), и в итоге получается общая сложность будет О(n2), а если итератором, то O(n), так как за проход сразу идём по элементам последовательно, а не каждый раз обращаемся к конкретному элементу?

    • @clipper1995N
      @clipper1995N Рік тому +1

      Ты немного запутался. Смотри: фишка с замедлением обусловлена методами set() и get() LnkedList-а, которые часто вызываются в циклое For-Each , и каждый раз каждый вызов этих методов заставляет обходить условно "всю" коллекцию со сложность O(n) на каждом шаге итерации в циклое For-Each

  • @caffeinejavacode1475
    @caffeinejavacode1475 Рік тому

    Если мы хотим получить элемент за константное время из LinkedList то нужно использовать Iterator
    или O(1) работает только когда нам нужно именно перебрать елементы?

    • @arhitutorials
      @arhitutorials  Рік тому

      Из LinkedList нельзя получить произвольный элемент за O(1) . По этому имеет смысл использовать его для организации очереди или стека. То есть, когда произвольный доступ не нужен, а нужен доступ только к первому/последнему элементу и возможность удаления/вставки.

  • @vb7038
    @vb7038 2 роки тому

    А как получить такое оформление документации в idea?

  • @phello57
    @phello57 Місяць тому

    6:20 - смотрит на итерацию всего линкед листа, проходит каждый элемент - называет, что это константа ¯\_(ツ)_/¯
    сударь, учите мат часть

  • @Grandik312
    @Grandik312 2 роки тому

    Доброго времени суток! Объясните, пожалуйста, почему в следующем коде возникает исключение NoSuchElementException?
    public class Test {
    public static void main(String[] args) {
    ArrayList ints = new ArrayList(Arrays.asList(1, 2, 3));
    ArrayList strings = new ArrayList(Arrays.asList("One", "Two", "Three", "four", "five"));
    Iterator iterInts = ints.iterator();
    Iterator iterStrings = strings.iterator();
    while(iterInts.hasNext()){
    while (iterStrings.hasNext()){
    System.out.println(iterInts.next() + " - " + iterStrings);
    }
    }
    }
    }
    Вроде как, должно сработать 3 внешних цикла (по 3 элементам в списке), а внутри каждого их них сработать какое-угодно число циклов (в зависимости от элементов внутри второго списка). Но почему-то возникает ошибка...

    • @arhitutorials
      @arhitutorials  2 роки тому +2

      Итератор во внутреннем цикле один раз доходит до конца списка и в следующей итерации сразу выбрасывает исключение. Его ж нигде на начало списка не возвращают.

    • @Grandik312
      @Grandik312 2 роки тому

      @@arhitutorials Теперь понятно, спасибо.
      А возвращать Iterator в начало, только его пересозданием:
      Iterator iterStrings = strings.iterator(); ?

    • @arhitutorials
      @arhitutorials  2 роки тому +2

      @@Grandik312 Да, пересозданием. То же самое было бы и при использовании for(String str: strings) {}
      - тоже создается новый итератор.

  • @mikhaillazarev5378
    @mikhaillazarev5378 2 роки тому

    Разве класс и интерфейс это одно и тоже?
    В начале видео автор сказал что Iterator это класс, а после когда вошел в документацию, уже говорит что это интерфейс.
    Буду очень благодарен за прояснение =)

  • @AlexeyZubkov
    @AlexeyZubkov Рік тому

    в русском языке есть аналог слова Iterable?

  • @user-01-g6d
    @user-01-g6d 2 роки тому

    Почему программисты так боятся написать лишнюю строчку кода? Как будто вагоны разгружают.

    • @xaptmah5354
      @xaptmah5354 2 роки тому

      2 + 3 + 4 - 2 + 6 - 7 + 9 - 2 + 2 - 9 - 2 = ?
      2 + 2 = ?
      это если очень сильно притянуть за уши, то примерно по этому.

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil Рік тому

      это к чему замечание?

  • @clipper1995N
    @clipper1995N Рік тому

    Здравствуйте! Спасибо за интересные видео, я учусь по ним некоторым паттернам и способами решения задач. Обычно я потом в голове "компилирую" полученные знания и делаю свое решение. Я внимательно изучил Ваше решение, и решил сделать что-то в этом ключе. У меня получилась более короткая реализация - один метод и два итератора. Я чувствую, что возможно я не вижу какие есть недостатки в моем решении по сравнению с Вашим, не могли бы Вы оценить и прокомментировать, может я что-то не учел?
    private static void sortByIterator(List a) {
    ListIterator iteratorOuter = a.listIterator();
    while (iteratorOuter.hasNext()) {
    int outerIndex = iteratorOuter.nextIndex();
    int minValue = iteratorOuter.next();
    ListIterator iteratorInner = a.listIterator(outerIndex);
    while (iteratorInner.hasNext()) {
    int innerValue = iteratorInner.next();
    if (innerValue < minValue) {
    iteratorInner.set(minValue);
    iteratorOuter.set(innerValue);
    minValue = innerValue;
    }
    }
    }
    }

  • @heavenstunes1297
    @heavenstunes1297 7 місяців тому

    спасибо за полезные видео!

  • @savax2718
    @savax2718 2 роки тому

    Спасибо за видео!