почему нет смысла ехать по H1B?

Sam Adams
Уже с Приветом
Posts: 1316
Joined: 03 Jul 2003 06:02
Location: USA

Post by Sam Adams »

newbee wrote:foreach как раз и использует итератор, только не понятно, как он себя будет вести при попутном удалении элементов из коллекции...


Что ж там непонятного, выкинет InvalidOperationException при первом обращении к итератору после того, как коллекция была изменена.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Sam Adams wrote:А что, во время итерирования коллекций в Java можно изменять содержимое коллекции? 8O

Теоретически если коллекция представляет собой Linked List, то вполне возможно удалять элементы во время итерирования.
Но в том то и дело что ArrayList это не linked list, а динамический массив.
Aquila non captat muscas
User avatar
Sergey_P
Уже с Приветом
Posts: 5280
Joined: 01 Nov 2000 10:01
Location: (RU->WA->NJ->?)

Post by Sergey_P »

newbee wrote:
2005 wrote:
newbee wrote:Если не понятно, то какой же это нафик итератор?

итератор, ИМХО, нужен, чтобы стандартизировать пробегание коллекции

Как говорил Дядя Федор "Ой непройму о чем вы спорите". Создаем еще один ArrayList и в него засовываем правильные строки
User avatar
KP580BE51
Уже с Приветом
Posts: 15007
Joined: 14 Jun 2005 11:50
Location: Ukraine

Post by KP580BE51 »

Kuzmin99 wrote:И с нами работал 1 переводчик, у него то английский тогда был гораздо лучше моего, так как это его профессия. так вот он постоянно плевался о том какие безграмотные что американцы что европейцы. при чем безграмотность не в том что слово не так написал а то что грамматика хромает и очень сильно.

Это что, мешало работе? (безграмотность?)
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Sergey_P wrote:Как говорил Дядя Федор "Ой непройму о чем вы спорите". Создаем еще один ArrayList и в него засовываем правильные строки

Это тоже решение. Которое дает 1 из 3 кандидитов.
Неоптимальное по сравнению с пробеганием коллекции в обратном направлении (которое еще ни одни Кумар не предложил), но работающее.
Aquila non captat muscas
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Gennadiy wrote:
2005 wrote:Если не понятно, то какой же это нафик итератор?

Вполне понятно как он будет себя вести. Он даст exception: collection was modified. Как и почему он это делает вопрос для интервью слишком замысловаты.


Пожалуй я согласен у вас поработать за $200K. :mrgreen:
Не буду утверждать про .Net, но вообще-то удаление элементов коллекции это стандартная функция итератора и никаких exceptions не будет, если это делать средствами итератора.
Смотрите ниже, класс Iterator, метод remove(). Там же ArrayList.
http://java.sun.com/j2se/1.4.2/docs/api/
Last edited by 2005 on 16 Jun 2006 16:35, edited 1 time in total.
Kuzmin99
Удалён за грубость
Posts: 75
Joined: 15 Jun 2006 09:08

Post by Kuzmin99 »

Geva wrote:
Kuzmin99 wrote: 2000 это супер образец! меня бы щас в 2000...миллионы бы сделал...:))))))
Миллионы обычно делают в периоды потрясений, а вовсе не стабильности.


надеюсь вы не рассчитываете начать дискуссию о том как делать миллионы?
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Gennadiy wrote:
Sam Adams wrote:А что, во время итерирования коллекций в Java можно изменять содержимое коллекции? 8O

Теоретически если коллекция представляет собой Linked List, то вполне возможно удалять элементы во время итерирования.
Но в том то и дело что ArrayList это не linked list, а динамический массив.


Ерунда, не нужен для этого Linked List.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Так. Отвлеклись.
KP580BE51 wrote:Стериотипы.

У нас было много работников с опытом работы в Азии. Сингапур, Тайвань, Малайзия, Индонезия, Корея, Филиппины. Их опыт оттуда был мягко говоря не очень. Россия им в этом плане даст 10 очков вперед. Не говоря уж об Европе и тем более Америке. Может выборка нерепрезетативная, но уж какая есть.
Как это "человек едет не в конкретное место"? На визах в большинстве стран есть четкая привязка к работодателю. Что дает как кучу плюсов так и минусов.

В Америке это привязка не четкая. Поменять можно довольно легко.
Я думаю что кореляция по работам, гораздо больше чем кореляция по странам. И единственное что можно более менее четко узнать про страну, это климат.

Я работал в нескольких местах и там и тут. При чем в разных отраслях .Все таки от страны очень многое зависит.
Aquila non captat muscas
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

2005 wrote:Не буду утверждать про .Net, но вообще-то удаление элементов коллекции это стандартная функция итератора

Вопрос то был именно про .Net.
Как это делается где-то еще вопрос совершенно другой и к делу отношения не имеет.
Aquila non captat muscas
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

2005 wrote:Ерунда, не нужен для этого Linked List.

В чем ерунда? В том что для linked list-а процедура удаления элемента во время итерации естественна (в .NET ее искуственно запретили, чтобы у всех типов коллекций было одинаковое поведение), а для к примеру массива (array) потребует нехилых танцев с бубнами при реализации?
Aquila non captat muscas
User avatar
Sergey_P
Уже с Приветом
Posts: 5280
Joined: 01 Nov 2000 10:01
Location: (RU->WA->NJ->?)

Post by Sergey_P »

Gennadiy wrote:Да. Это самый простой из работющих способов.

Протестую, мой проще и универсальней (будет с любой коллекцией работать)
User avatar
Sergey_P
Уже с Приветом
Posts: 5280
Joined: 01 Nov 2000 10:01
Location: (RU->WA->NJ->?)

Post by Sergey_P »

Gennadiy wrote:
Sergey_P wrote:Как говорил Дядя Федор "Ой непройму о чем вы спорите". Создаем еще один ArrayList и в него засовываем правильные строки

Это тоже решение. Которое дает 1 из 3 кандидитов.
Неоптимальное по сравнению с пробеганием коллекции в обратном направлении (которое еще ни одни Кумар не предложил), но работающее.

Опять протестую. По производительности оно существенно лучше (копирование из одного ArrayList в другой vs. удаление из произвольного места ArrayList). Iterator конечно цыклу уступит но это будут такие мелочи
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Gennadiy wrote:
2005 wrote:Ерунда, не нужен для этого Linked List.

В чем ерунда? В том что для linked list-а процедура удаления элемента во время итерации естественна (в .NET ее искуственно запретили, чтобы у всех типов коллекций было одинаковое поведение), а для к примеру массива (array) потребует нехилых танцев с бубнами при реализации?


Нет там никаких танцев с бубнами, удаляется элемент из обычного листа путем вычитания из индексов элементов массива цифры 1.
Похоже никогда никто не исправит уже кривые руки MS. :mrgreen:
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Sergey_P wrote:Протестую, мой проще и универсальней (будет с любой коллекцией работать)

Чисто с практической точки зрения это не всегда так.
Очень часто коллекция или предается как параметр by value в процедури или представляет собой read-only property.
В таком случае, кроме создания новой коллекции, итерации, копирования, понадобится также очистка старой коллекции и копирование из новой в старую. В зависимости от того сколько элементов удаляется, это может быть и медленнее и конкретно потребует больше памяти.
Aquila non captat muscas
Sam Adams
Уже с Приветом
Posts: 1316
Joined: 03 Jul 2003 06:02
Location: USA

Post by Sam Adams »

Gennadiy wrote:
Sergey_P wrote:Как говорил Дядя Федор "Ой непройму о чем вы спорите". Создаем еще один ArrayList и в него засовываем правильные строки

Это тоже решение. Которое дает 1 из 3 кандидитов.
Неоптимальное по сравнению с пробеганием коллекции в обратном направлении (которое еще ни одни Кумар не предложил), но работающее.


Справедливости ради, нужно установить критерий оптимальности - по используемой памяти (что в наше время зачастую неактуально) либо же по скорости выполнения (что тоже часто, увы, неактуально). Вариант с дополнительным ArrayList будет работать быстрее из-за того, что не будет происходить копирование правой части массива после каждого удаления. А ожидал бы я от интервьюируемого примерно такого ответа, оптимального по скорости и не использующего дополнительной памяти -

FW 2.0

Code: Select all

List<string> a = ...
a.RemoveAll(delegate(string s) { return s.StartsWith("A"); });


FW 1.1

Code: Select all

static void RemoveAt(ArrayList list, string prefix)
{
   int j = 0;
   for (int i = 0; i < list.Length; i++)
   {
      if ((string)list[i]).StartsWith(prefix))
      {
          list[j++] = list[i];
      }
   }
   if (list.Length != j)
   {
      list.Remove(j, list.Length - j);
   }
}


(писал навскидку, мог ошибиться, но идея ясна)
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

2005 wrote:Похоже никогда никто не исправит уже кривые руки MS. :mrgreen:

А при чем тут кривые руки? В стандартную поставку .NET входят немодифицирующие итераторы. Никто вам не мешает написать свой модифицирующий.
Aquila non captat muscas
Sam Adams
Уже с Приветом
Posts: 1316
Joined: 03 Jul 2003 06:02
Location: USA

Post by Sam Adams »

Gennadiy wrote:
Sam Adams wrote:А что, во время итерирования коллекций в Java можно изменять содержимое коллекции? 8O

Теоретически если коллекция представляет собой Linked List, то вполне возможно удалять элементы во время итерирования.
Но в том то и дело что ArrayList это не linked list, а динамический массив.


Теоретически, если _любая_ коллекция написана, следуя рекомендациям, то она обязана выкидывать исключение при обращении к итератору после изменения коллекции. Это же отностится и к LinkedList.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Sam Adams wrote:писал навскидку, мог ошибиться, но идея ясна

Да идея ясна (хоть implementation с ошибками). И этот алгоритм будет самым оптимальным (из тех что мне известно). Хоть и не самым простым. Но о таких ответах даже и мечтать не приходится. :(
Aquila non captat muscas
User avatar
Sergey_P
Уже с Приветом
Posts: 5280
Joined: 01 Nov 2000 10:01
Location: (RU->WA->NJ->?)

Post by Sergey_P »

2005 wrote:Смотрите ниже, класс Iterator, метод remove(). Там же ArrayList.
http://java.sun.com/j2se/1.4.2/docs/api/

В Java - да
BTW
Removes from the underlying collection the last element returned by the iterator (optional operation).
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Sam Adams wrote:Это же отностится и к LinkedList.

На практике он и будет выбрасывать exception. Я же написал - теоретически.
Aquila non captat muscas
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Sam Adams wrote:
Gennadiy wrote:
Sam Adams wrote:А что, во время итерирования коллекций в Java можно изменять содержимое коллекции? 8O

Теоретически если коллекция представляет собой Linked List, то вполне возможно удалять элементы во время итерирования.
Но в том то и дело что ArrayList это не linked list, а динамический массив.


Теоретически, если _любая_ коллекция написана, следуя рекомендациям, то она обязана выкидывать исключение при обращении к итератору после изменения коллекции. Это же отностится и к LinkedList.


Надо бы говорить - ".. после изменения коллекции извне, не средствами итератора", а то неправда получается.
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Gennadiy wrote:
2005 wrote:Похоже никогда никто не исправит уже кривые руки MS. :mrgreen:

А при чем тут кривые руки? В стандартную поставку .NET входят немодифицирующие итераторы. Никто вам не мешает написать свой модифицирующий.


Так это и есть кривые руки, когда основные low-level операции самому надо писать.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

2005 wrote:Так это и есть кривые руки, когда основные low-level операции самому надо писать.

В 2.0 большинсто этих операций уже есть. А в Java в какой версии они появились?
Aquila non captat muscas
2005
Удалён за грубость
Posts: 1756
Joined: 29 Mar 2005 01:01

Post by 2005 »

Gennadiy wrote:
2005 wrote:Так это и есть кривые руки, когда основные low-level операции самому надо писать.

В 2.0 большинсто этих операций уже есть. А в Java в какой версии они появились?


В 1.2, то бишь очень давно.

Return to “Работа и Карьера в IT”