10 тысяч удалений и вставок

  • 5
  • Недоступна
Повторение однообразных действий без нытья и катанья — вот чем славны компьютеры, вот чего помогают избегать программисты простым смертным! Не будь средств автоматизации повторений, условие этой задачи звучало бы как приговор. А так вроде бы все нормально: для arrayList и linkedList провести 10 тысяч вставок, удалений, а также вызовов get и set.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (107)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Wladyslaw10 уровень
15 июня, 15:57
AL INSERT 2 AL GET 1 AL SET 1 AL REMOVE 10 LL INSERT 2 LL GET 111 LL SET 118 LL REMOVE 53 Как-то ЛинкедЛист не очень смотрится
fedor20 уровень, Москва
2 апреля, 09:07
ArrayList<Integer> - нелинейная зависимость от объема. 10к - за 10-12ms 100к - 540-630ms 500к - 12.750+ms 1млн - <не дождался! не менее ТРЁХ МИНУТ> Вероятная причина: массив всегда пишется в память "одной полосой" и свободное место под это хозяйство (когда .add(элемент) - это уже новый массив ! ) - нужно еще поискать LinkedList<Integer> - тут все плохо 10к - 87-90ms 100к - 8.250 - 8.410ms 300к - 108.655ms 500к - <не дождался! не менее СЕМИ МИНУТ> 1млн - <не запускал>
Oleg Zaytsev24 уровень
24 февраля, 15:32
ArrayList arrayList = new ArrayList(); Почему не указываем тип переменной? по умолчанию Object использует?
Anastasia15 уровень, Нижний Новгород
23 февраля, 15:29
непонятно было, что именно добавлять в методах set и add. Пошла читать комменты. Оказалось - что угодно)
Oleg Zaytsev24 уровень
24 февраля, 15:32
можно добавить i
Александр8 уровень, Москва
4 марта, 15:39
разрабам жр скучно прост!
Евгений20 уровень, Днепр
15 февраля, 20:29
Если для всех операций использовать позицию
int pos = (int) (Math.random() * list.size());
if (pos > 0) pos--;
результат будет более релевантным, кмк.
y-grek14 уровень, Киев
25 декабря 2018, 15:30
думал начать ругаться, почему не проходит ремув() без аргумента, а оказалось в ЛинкдЛист он реализован. а в АррайЛисте ремув() без аргумента нет.. учим матчасть дальше..
S3R3N1TY35 уровень, Санкт-Петербург
18 декабря 2018, 15:14
Замерил время выполнения всех операций с Arraylist и linkedlist в этой задаче вышло arraylist time= 20 linkedlist time= 224
Aku24 уровень, Новосибирск
10 января, 16:44
у меня получилось 41 и 206. Отчего зависит разность времени, моего и твоего? код/комп?
Александр23 уровень, Казань
17 января, 14:56
Ну от среды выполнения. Чем мощнее, тем быстрее... А также от того, как ты свой код реализуешь - будешь ли ты его делать по умному, скажем удалять элементы remove с последнего, тогда не придется массив двигать, или добавлять элемент в конец а не в начало массива. 4, 83 (c правильным удалением с конца, и добавлением элементов в конец) И по операциям: list.add(i) 2 - 2 (при увеличение до 1М 25 - 194) list.add(0,i) 14 - 2 get 1 - 41 set 1 - 37 remove 9 - 2
for (int i = 0; i < 10000; i++) {
 list.remove(i);
}
или remove 0 - 2
for (int i = 9999; i >= 0; i--) {
 list.remove(i);
}
Никита Алиев11 уровень, Москва
17 февраля, 10:51
разве "i" верный аргумент для remove?
list.remove(i);
Александр23 уровень, Казань
18 февраля, 08:05
Возможно я неверный код предоставил. Там где мы считаем от 9999 и до 0 - то там i. А где от 0 до 10000, конечно же надо remove(0) делать. Иначе большинство удалений мы там пропустим.
Julia_Lemon8 уровень
3 апреля, 23:40
Как вы это замерили? Где можно посмотреть?
Александр23 уровень, Казань
6 мая, 07:01
Можешь вот тут прочитать https://javarush.ru/groups/posts/1935-udalenie-ehlementa-iz-spiska-arraylist У метода remove() есть две особенности. Во-первых, он не оставляет “дыр”. В нем уже реализована логика сдвига элементов при удалении элемента из середины
Alex15 уровень, Москва
15 ноября 2018, 18:37
Для удаления элементов из листа можно использовать цикл while.
Мишаня20 уровень
8 ноября 2018, 14:39
Решил проверить , что работает с какой скоростью через разницу дат создали арай Thu Nov 08 14:58:43 CET 2018 Арай закончен спустя 9 мс создали линк Thu Nov 08 14:58:43 CET 2018 линк закончен спустя 74 мс
sp11 sp1117 уровень
24 октября 2018, 10:13
В шоке с администрации. Вы за что деньги берете, господа? Каким образом ваш валидатор не пропускает
for (int i = 0; i < list.size(); i++)
а правильным считает
for (int i = 0; i < 10000; i++)
при том, что пункт insert10000(List list) успешно пройден, и это подтверждает наличие в списке 10000 элементов. По ходу прохождения курса решение задач постепенно превращается "найди один из 100 правильных вариантов, который понравится нашему валидотору". Бред.
Вадим17 уровень
3 ноября 2018, 22:31
А вы уверены, что в list.size() при проверке действительно 10000? Что, если при тестировании валидатор делает list вдвое больше, чтобы проверить, что вы действительно хотите удалить именно 10000, а не все элементы списка?
Мишаня20 уровень
8 ноября 2018, 14:41
конечно валидатор прав, лист сайз показывает 10 000 вначале и каждый раз уменьшается при удалении а i ++ увеличевается каждый раз, тоесть вместо одного раза два рваза грубо говоря вы удаляли только 5000 раз +-
sp11 sp1117 уровень
4 декабря 2018, 14:37
Мишаня, вы для начала бы разобрались, чтоб чушь не писать. Эта строка
for (int i = 0; i < list.size(); i++)
была указана в методе get10000, который следует сразу за insert. И она не позволяла пройти условие "Метод get10000(List list) должен вызывать 10 тысяч раз get у списка." Прочитайте несколько раз это условие, и вы поймете, что программа его абсолютно точно выполняла, и оно не нарушается при использовании функции list.size();
sp11 sp1117 уровень
4 декабря 2018, 14:49
"А вы уверены" Конечно уверен, я же собственноручно поместил туда их)
for (int i = 0; i < 10000; i++) {
    list.add(1);
}
"Что, если при тестировании.." А вот что если - меня вообще касаться не должно. Код верный, в нём нет ошибки, а какие чудеса шаманит с этим кодом валидатор - мне какое дело? Ну, представьте, что я написал там i < 10000*1, а валидатор при тестировании заменяет все *1 на *2, ну, вот так ему понадобилось, то же, что и списки удваивать. И что, условие "должен вызывать 10 тысяч раз get у списка" опять не пройдем.
Мишаня20 уровень
5 декабря 2018, 10:44
давай еще раз объяснить попытаюсь учитель из меня не очень. for (int i = 0; i < list.size(); i++) допустим у нас длина 10 а не 10 000 какая разница вообще. в цикле у тебя проходит list.remove(0); то есть теперь длина у тебя 9 листа - проверка 1<9 2цикл list.remove(0) 2<8 . 3цикл list.remove(0) 3<7. 4цикл list.remove(0) 4<6. 5цикл list.remove(0) 5<5. вот и все 5 циклов а не 10 . надеюсь теперь тебе все понятно будет в моем комментарии конечно валидатор прав, лист сайз показывает 10 000 вначале и каждый раз уменьшается при удалении а i ++ увеличевается каждый раз, тоесть вместо одного раза два рваза грубо говоря вы удаляли только 5000 раз +-
sp11 sp1117 уровень
5 декабря 2018, 12:50
Мишаня, вы в курсе, что программа выполняет команды не хаотично и наугад, а именно в том порядке, в котором они указаны в коде? Гляньте на эти строки:
insert10000(arrayList);
get10000(arrayList);
set10000(arrayList);
remove10000(arrayList);
метод ремув, о котором вы второй раз мне пишите, вызывается самым последним. метод гет, в котором было сравнение i < list.size() (ТОЛЬКО В ЭТОМ МЕТОДЕ) вторым по счету, сразу после инсерта. Как еще вам объяснить, что программа выполнялась правильно, и никаких ошибок в ней не было?
sp11 sp1117 уровень
5 декабря 2018, 13:03
1. Сравнение i < list.size() использовалось только в методе get. 2. При запуске валидации не проходило только условие "Метод get10000(List list) должен вызывать 10 тысяч раз get у списка". 3. По факту это условие выполнялось, потому, что перед методом гет вызывается метод инсерт, помещающий в список ровно 10000 элементов. 4. все остальные условия (включая(!!!) Метод remove10000(List list) должен удалять 10 тысяч элементов из списка) успешно проходили валидацию. Естественно, в них не использовалось сравнение i < list.size(); так как это было бы ошибкой. 5. валидация гет'а не проходила, потому, что валидатор шаманит с размерами списка, но почему это должно касаться меня? Я в коде, без какой либо инвариантности, помещаю в список 10000 элементов, значит и list.size() должен возвращать именно столько.
Diana Rasskazova15 уровень
23 января, 10:52
Я полностью согласна с вашим возмущением, тоже хотела об этом написать - это очень плохо изначально учить людей писать кусок кода, который в большинстве случаев нельзя назвать безопасными. Удалять из списка 10000 значений, не проверив сколько в нём значений хранится, - плохая практика. Я надеюсь, создатели курса обратят на это внимание и поправят. Тем не менее, Мишаня написал вам (дважды) совершенно верное замечание. Вот только не про тот метод ;) Он почему-то решил, что не проходит remove10000. И он бы действительно с таким кодом не прошёл, это легко проверить, добавив в цикл счётчик.
int count = 0;
for(int i = 0; i < list.size(); i++)
{
   list.remove(0);
   count++;
}
System.out.println(count);
Но это никак не объясняет почему не проходит валидацию метод get10000 при использовании ограничения по list.size(), ведь если поставить счётчик в него будет ровно 10000 операций. Так что господа создатели курса - поправьте, у вас ошибка!
MartyMcAir14 уровень
9 июня, 11:42
так же на этом запоролся.. т.е. называется: догадайся сам, что нет так.