Спасибо большое помогли разложить все по полочкам! Почему-то в книгах уделяют нексолько строк или совсем пропускают тему итератора. А штука то важная)) Как раз искал пример применения вне коллекции.
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 и т.д.)
6:50 после создания итератора до первого вызова next() итератор не указывает ни на какой элемент? И после первого вызова next() у нас появляется доступ к первому элементу, не ко второму?
не согласен на счет, что цикл( который по .get() ) по линкед листу это линейная, там будет квадратичная, потому что он начинает с головы и вынужден каждую итерацию искать iый элемент заного. Для линейной нужно создать переменную с сылкой на прошлую ноду
У меня такой вопрос.Вот вы говорите(и везде так написано) ,что удаление элемента в LinkedList происходит за константное время с помощью итератора,но итератор же ходит по всем элементам,т.е. чем много элементов ,тем много времени требуется для нахождении и удалении,никак не могу понять этот момент,не могли бы объяснить???
@@arhitutorials Спасибо за ответ.) Да ,я это понимаю,но если судить строго по Big O, то получается O(n)? Просто куда не смотришь везде говорится что удаление и ставка происходит за константное время (или может просто не учитывается время нахождения )
@@______________9358 Не учитывается время нахождения. Если, например, нужно удалить из списка все элементы, которые больше некоторого X, то будет один проход, вся операция будет займет O(n), удаление каждого отдельного элемента в ней - O(1).
Iterable нужен для того, чтоб класс можно было использовать в операторе for. На одной коллекции может быть несколько итераторов, по этому коллекция не может быть итератором самой себя.
Правильно ли я понимаю, что при проходе по LinkedList циклом for(i)(не for(each)), то обращение к каждому элементу O(n), и в итоге получается общая сложность будет О(n2), а если итератором, то O(n), так как за проход сразу идём по элементам последовательно, а не каждый раз обращаемся к конкретному элементу?
Ты немного запутался. Смотри: фишка с замедлением обусловлена методами set() и get() LnkedList-а, которые часто вызываются в циклое For-Each , и каждый раз каждый вызов этих методов заставляет обходить условно "всю" коллекцию со сложность O(n) на каждом шаге итерации в циклое For-Each
Про компаратор уже есть: th-cam.com/video/hqIXm7Ontdg/w-d-xo.html Про стримы хочется что-нибудь оригинальное придумать, но пока идей нет. А просто повторять то, что сказано в документации, смысла не вижу.
Если мы хотим получить элемент за константное время из LinkedList то нужно использовать Iterator или O(1) работает только когда нам нужно именно перебрать елементы?
Из LinkedList нельзя получить произвольный элемент за O(1) . По этому имеет смысл использовать его для организации очереди или стека. То есть, когда произвольный доступ не нужен, а нужен доступ только к первому/последнему элементу и возможность удаления/вставки.
Доброго времени суток! Объясните, пожалуйста, почему в следующем коде возникает исключение 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 элементам в списке), а внутри каждого их них сработать какое-угодно число циклов (в зависимости от элементов внутри второго списка). Но почему-то возникает ошибка...
Итератор во внутреннем цикле один раз доходит до конца списка и в следующей итерации сразу выбрасывает исключение. Его ж нигде на начало списка не возвращают.
Сам метод remove() работает за константное время, но переборка то все равно линейная, так что все равно задача по удалению элемента имеет линейную сложность
Разве класс и интерфейс это одно и тоже? В начале видео автор сказал что Iterator это класс, а после когда вошел в документацию, уже говорит что это интерфейс. Буду очень благодарен за прояснение =)
Здравствуйте! Спасибо за интересные видео, я учусь по ним некоторым паттернам и способами решения задач. Обычно я потом в голове "компилирую" полученные знания и делаю свое решение. Я внимательно изучил Ваше решение, и решил сделать что-то в этом ключе. У меня получилась более короткая реализация - один метод и два итератора. Я чувствую, что возможно я не вижу какие есть недостатки в моем решении по сравнению с Вашим, не могли бы Вы оценить и прокомментировать, может я что-то не учел? 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; } } } }
Ценю ваши видео за то, что рассказываете суть языка и всякие подводные камешки, очень полезно!
То, что в for можно не только коллекцию использовать, было довольно интересно.
Дай Бог тебе здоровья! Классно объяснил 👌
Сергей, большая вам благодарность! Вы очень четко, последовательно и понятно объясняете материал! Успехов вам во всем!
Спасибо большое помогли разложить все по полочкам! Почему-то в книгах уделяют нексолько строк или совсем пропускают тему итератора. А штука то важная)) Как раз искал пример применения вне коллекции.
Спасибо за видео! Понятно объясняешь!
Сергей, спасибо! Прекрасные видео. Отблагодарил по ссылочке, как смог ;)
Получил. Большое спасибо!
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 и т.д.)
Сергей спасибо, минимум воды, максимум по делу.
Как всегда - очень интересно! Спасибо!
Отлично! Как всегда полезно и по существу. Отдельно порадовал метод "Ад" ))
спасибо за весь труд, вложенный в видео
Спасибо большое, хороший разбор
Отличное объяснение! Спасибо!
Спасибо за наглядность.
Спасибо за четкое и понятное объяснение)
Спасибо большое за видео!
супер просто и понятно! спасибо
Офигенно объяснил! Спасибо!
Спасибо большое
Спасибо, очень помогает на старте :)
Спасибо, полезные примеры
Спасибо за урок.
Полезная информация👍
спасибо, очень полезная инфа)
ты реально крут :) Tnx!
большое спасибо, доходчиво объяснили!
Круто всё объясняешь красавец
Спасибо!☺
Подписка!
Красавчик!!!
мораль - всегда юзайте ArrayList
Супер!!
Спасибо. Вот только не понял как с Iterable работать. Нужно разобраться
Спасибо
Имели ввиду нет быстрого удаления в LinkedList? 6:13
Так оно и есть. Удалить быстрее, чем в дефолтной имплементации ArrayList "удалили-сдвинули", даже итератору не под силу)
6:50 после создания итератора до первого вызова next() итератор не указывает ни на какой элемент? И после первого вызова next() у нас появляется доступ к первому элементу, не ко второму?
Может кто подробнее объяснить почему итератор быстрее перебирает элементы в связанном списке?
не согласен на счет, что цикл( который по .get() ) по линкед листу это линейная, там будет квадратичная, потому что он начинает с головы и вынужден каждую итерацию искать iый элемент заного. Для линейной нужно создать переменную с сылкой на прошлую ноду
У меня такой вопрос.Вот вы говорите(и везде так написано) ,что удаление элемента в LinkedList происходит за константное время с помощью итератора,но итератор же ходит по всем элементам,т.е. чем много элементов ,тем много времени требуется для нахождении и удалении,никак не могу понять этот момент,не могли бы объяснить???
За один проход можно удалить/вставить несколько элементов. Ну а если по одному элементу каждый раз искать в списке и удалять, то будет медленно.
@@arhitutorials Спасибо за ответ.) Да ,я это понимаю,но если судить строго по Big O, то получается O(n)? Просто куда не смотришь везде говорится что удаление и ставка происходит за константное время (или может просто не учитывается время нахождения )
@@______________9358 Не учитывается время нахождения.
Если, например, нужно удалить из списка все элементы, которые больше некоторого X, то будет один проход, вся операция будет займет O(n), удаление каждого отдельного элемента в ней - O(1).
@@arhitutorials спасибо большое!
@@arhitutorials Спасибо большое! У меня был такой же вопрос, разобрался.
А как получить такое оформление документации в idea?
Все круто, а зачем Iterable отдельно нужен? Можно же обойтись только Iterator и его реализовывать или я не прав?
Iterable нужен для того, чтоб класс можно было использовать в операторе for.
На одной коллекции может быть несколько итераторов, по этому коллекция не может быть итератором самой себя.
Правильно ли я понимаю, что при проходе по LinkedList циклом for(i)(не for(each)), то обращение к каждому элементу O(n), и в итоге получается общая сложность будет О(n2), а если итератором, то O(n), так как за проход сразу идём по элементам последовательно, а не каждый раз обращаемся к конкретному элементу?
Ты немного запутался. Смотри: фишка с замедлением обусловлена методами set() и get() LnkedList-а, которые часто вызываются в циклое For-Each , и каждый раз каждый вызов этих методов заставляет обходить условно "всю" коллекцию со сложность O(n) на каждом шаге итерации в циклое For-Each
Чувствую скоро будет компаратор и стримы))
Про компаратор уже есть:
th-cam.com/video/hqIXm7Ontdg/w-d-xo.html
Про стримы хочется что-нибудь оригинальное придумать, но пока идей нет. А просто повторять то, что сказано в документации, смысла не вижу.
Если мы хотим получить элемент за константное время из LinkedList то нужно использовать Iterator
или O(1) работает только когда нам нужно именно перебрать елементы?
Из LinkedList нельзя получить произвольный элемент за O(1) . По этому имеет смысл использовать его для организации очереди или стека. То есть, когда произвольный доступ не нужен, а нужен доступ только к первому/последнему элементу и возможность удаления/вставки.
Доброго времени суток! Объясните, пожалуйста, почему в следующем коде возникает исключение 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 Теперь понятно, спасибо.
А возвращать Iterator в начало, только его пересозданием:
Iterator iterStrings = strings.iterator(); ?
@@Grandik312 Да, пересозданием. То же самое было бы и при использовании for(String str: strings) {}
- тоже создается новый итератор.
Сам метод remove() работает за константное время, но переборка то все равно линейная, так что все равно задача по удалению элемента имеет линейную сложность
в русском языке есть аналог слова Iterable?
6:20 - смотрит на итерацию всего линкед листа, проходит каждый элемент - называет, что это константа ¯\_(ツ)_/¯
сударь, учите мат часть
Почему программисты так боятся написать лишнюю строчку кода? Как будто вагоны разгружают.
2 + 3 + 4 - 2 + 6 - 7 + 9 - 2 + 2 - 9 - 2 = ?
2 + 2 = ?
это если очень сильно притянуть за уши, то примерно по этому.
это к чему замечание?
Разве класс и интерфейс это одно и тоже?
В начале видео автор сказал что Iterator это класс, а после когда вошел в документацию, уже говорит что это интерфейс.
Буду очень благодарен за прояснение =)
Здравствуйте! Спасибо за интересные видео, я учусь по ним некоторым паттернам и способами решения задач. Обычно я потом в голове "компилирую" полученные знания и делаю свое решение. Я внимательно изучил Ваше решение, и решил сделать что-то в этом ключе. У меня получилась более короткая реализация - один метод и два итератора. Я чувствую, что возможно я не вижу какие есть недостатки в моем решении по сравнению с Вашим, не могли бы Вы оценить и прокомментировать, может я что-то не учел?
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;
}
}
}
}
спасибо за полезные видео!
Спасибо за видео!