удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 20:48
Оценка:
Такой вопрос —

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

    public static void ChangeValues( IList myList )  
    {
            
        System.Collections.IEnumerator myEnumerator = myList.GetEnumerator();
        
        
        while ( myEnumerator.MoveNext() )
        {
        //добавляю в другой ArrayList текущий номер, чтобы затем в другом цикле удалить
        //эту запись
        }
    
    }
... <<Britney — camper Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re: удаление элементов ArrayList
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.11.04 21:17
Оценка: 1 (1)
Здравствуйте, DEMON HOOD, Вы писали:

DH>есть набор элементов с которыми нужно работать,

DH>пусть это будут случайные числа
DH>использую ArrayList т.к удобно динамически увеличивать размерность массива,
DH>но мне нужно также и удалять значения, например удалять все четные числа
DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать
DH>дополнительный массив, может нужно не ArrayList использовать?

А может проще не использовать энумератор?
... << RSDN@Home 1.1.4 beta 3 rev. 228>>
AVK Blog
Re[2]: удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 21:39
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, DEMON HOOD, Вы писали:


DH>>дополнительный массив, может нужно не ArrayList использовать?


AVK>А может проще не использовать энумератор?

как тогда? мне нужно переодически просматривать весь массив и манипулировать с хранимыми данными.
... <<Rammstein — Zwitter Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[3]: удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 21:52
Оценка: :)
Здравствуйте, DEMON HOOD, Вы писали:

DH>Здравствуйте, AndrewVK, Вы писали:


AVK>>Здравствуйте, DEMON HOOD, Вы писали:


DH>>>дополнительный массив, может нужно не ArrayList использовать?


AVK>>А может проще не использовать энумератор?

DH>как тогда? мне нужно переодически просматривать весь массив и манипулировать с хранимыми данными.
спросил и понял, что ступил
... <<Rammstein — Adios Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re: удаление элементов ArrayList
От: kondrat_kiev  
Дата: 09.11.04 06:58
Оценка: 1 (1)
Здравствуйте, DEMON HOOD, Вы писали:

DH>Такой вопрос —


DH>есть набор элементов с которыми нужно работать,

DH>пусть это будут случайные числа
DH>использую ArrayList т.к удобно динамически увеличивать размерность массива,
DH>но мне нужно также и удалять значения, например удалять все четные числа
DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать
DH>дополнительный массив, может нужно не ArrayList использовать?

DH>
DH>    public static void ChangeValues( IList myList )  
DH>    {
            
DH>        System.Collections.IEnumerator myEnumerator = myList.GetEnumerator();
        
        
DH>        while ( myEnumerator.MoveNext() )
DH>        {
DH>        //добавляю в другой ArrayList текущий номер, чтобы затем в другом цикле удалить
DH>        //эту запись
DH>        }
    
DH>    }
DH>


А если использовать следующий код:
public void DeleteEvenNumbers(ArrayList myArray)
{
    for(int i=0; i<myArray.Count; i++ )
    {
        if (myArray[i]%2 == 0)
        {
            myArray.RemoveAt(i);
        }
    }
}
... << RSDN@Home 1.1.3 stable >>
Re[2]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:27
Оценка: :)
Здравствуйте, kondrat_kiev, Вы писали:

_>А если использовать следующий код:

_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>


Менять контент коллекции в процессе перечисления ее элементов низзя.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:27
Оценка:
Можно пробегать по исходному списку и нужные элементы, т.е. те, которые не надо удалять, копировать в новый список, типа
IList FilterList(IList sourceList, IComparer criteria)
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[2]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 07:45
Оценка:
Здравствуйте, kondrat_kiev, Вы писали:
_>А если использовать следующий код:
_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>

Так не будет работать, например, со списком, состоящим только из чётных элементов.
А так должно.
      for(int i = 0; i < myArray.Count;) {
        if((int)myArray[i] % 2 == 0) {
          myArray.RemoveAt(i);
        } else {
          i++;
        }//if
      }//for
Help will always be given at Hogwarts to those who ask for it.
Re[3]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 07:48
Оценка: +2
Здравствуйте, Сантехник, Вы писали:
_>>public void DeleteEvenNumbers(ArrayList myArray)
_>>{
_>>    for(int i=0; i<myArray.Count; i++ )
_>>    {
_>>        if (myArray[i]%2 == 0)
_>>        {
_>>            myArray.RemoveAt(i);
_>>        }
_>>    }
_>>}

С>Менять контент коллекции в процессе перечисления ее элементов низзя.

В приведённом примере можно. Нельзя при запущенном IEnumerator, а здесь он не используется.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 07:48
Оценка:
С>Менять контент коллекции в процессе перечисления ее элементов низзя.

Почему нельзя??? В этой ситуации енумератор не используется, поэтому можно.
Только надо учесть, что после удаления элемента myArray.RemoveAt(i), если ничего с переменной цикла i не делать — следующей итерацией ты перепрыгнешь через один элемент коллекции. Чтобы этого не было, добавляй i-- в теле цикла.
Re[4]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:55
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>В приведённом примере можно. Нельзя при запущенном IEnumerator, а здесь он не используется.


Я имел в виду не конкретно этот пример, а как good-practice в принципе.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[5]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:02
Оценка:
С>Я имел в виду не конкретно этот пример, а как good-practice в принципе.

А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?
Re[6]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 08:20
Оценка:
Здравствуйте, Wile, Вы писали:

W>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?


Ну, к примеру, мой вариант был здесь
Автор: Сантехник
Дата: 09.11.04
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[7]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:32
Оценка:
Здравствуйте, Сантехник, Вы писали:

С>Здравствуйте, Wile, Вы писали:


W>>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?


С>Ну, к примеру, мой вариант был здесь
Автор: Сантехник
Дата: 09.11.04


С>Можно пробегать по исходному списку и нужные элементы, т.е. те, которые не надо удалять, копировать в С>новый список...


А если коллекция здоровая?
Re[4]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 08:38
Оценка:
Несогласие как-нить прокоментировать возможно?
Help will always be given at Hogwarts to those who ask for it.
Re[8]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 08:40
Оценка: +1
Здравствуйте, Wile, Вы писали:

W>А если коллекция здоровая?


Если здоровая, то, имхо, накладные расходы на копирование элементов при удалении элементов из середины ArrayList'а в этом варианте

public void DeleteEvenNumbers(ArrayList myArray)
{
    for(int i=0; i<myArray.Count; i++ )
    {
        if (myArray[i]%2 == 0)
        {
            myArray.RemoveAt(i);
        }
    }
}



будут нехилые.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[5]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:47
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Несогласие как-нить прокоментировать возможно?


Я прошу прощения, млин промахнулся... Ошибся сообщением, д.б. быть предыдущее... Я могу как-то исправить свою ошибку?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[6]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 08:53
Оценка:
Здравствуйте, Wile, Вы писали:
_FR>>Несогласие как-нить прокоментировать возможно?
W>Я прошу прощения, млин промахнулся... Ошибся сообщением, д.б. быть предыдущее... Я могу как-то исправить свою ошибку?

Ничего, с кем не случается
Help will always be given at Hogwarts to those who ask for it.
Re[9]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 09:09
Оценка:
Похоже по скорости выполнения ты прав,
но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[10]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 09:20
Оценка:
Здравствуйте, Wile, Вы писали:

W>Похоже по скорости выполнения ты прав,

W>но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...

Чем тяжеловат?
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[11]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 09:25
Оценка:
Здравствуйте, Сантехник, Вы писали:

С>Здравствуйте, Wile, Вы писали:


W>>Похоже по скорости выполнения ты прав,

W>>но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...

С>Чем тяжеловат?


Компарером. Его писать надо. В итоге коду больше.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[12]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 09:30
Оценка:
Здравствуйте, Wile, Вы писали:

W>Компарером. Его писать надо. В итоге коду больше.


Хе, ну дык тут стандартный выбор между производительностью и универсальностью.
Хотя для обсуждаемой задачи компарер пишется за 3 секи.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[13]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 09:40
Оценка:
W>>Компарером. Его писать надо. В итоге коду больше.

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

С>Хотя для обсуждаемой задачи компарер пишется за 3 секи.

Да это ясно, что за 3 секи, интересно просто, можно ли обойтись без компарера, и вообще без копирования
... << Rsdn@Home 1.1.4 beta 1 >>
Re: удаление элементов ArrayList
От: TK Лес кывт.рф
Дата: 09.11.04 10:10
Оценка:
Hello, "DEMON HOOD"
>
> может нужно не ArrayList использовать?

Скачай CodeSmith там есть готовые шаблоные по которым можно сгенерировать полностью типизированные аналог ArrayList для того-же int.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: удаление элементов ArrayList
От: ie Россия http://ziez.blogspot.com/
Дата: 09.11.04 15:50
Оценка:
Здравствуйте, DEMON HOOD, Вы писали:

DH>Такой вопрос —


DH>есть набор элементов с которыми нужно работать,

DH>пусть это будут случайные числа
DH>использую ArrayList т.к удобно динамически увеличивать размерность массива,
DH>но мне нужно также и удалять значения, например удалять все четные числа
DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать
DH>дополнительный массив, может нужно не ArrayList использовать?

Может тогда заюзать такой Comparer:

    public class OddEvenComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            if ((int)x % 2 == (int)y % 2)
            {
                return 0;
            }
            else
            {
                return ((int)x % 2 == 0) ? 1 : -1;
            }
        }
    }


Отсортировать массив используя данный компарер. Т.о. получим массив в котором все четные в конце. И удалить этот конец.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Превратим окружающую нас среду в воскресенье.
Re[2]: удаление элементов ArrayList
От: DEMON HOOD  
Дата: 09.11.04 20:00
Оценка:
Здравствуйте, kondrat_kiev, Вы писали:


_>А если использовать следующий код:

_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>

Спасибо!
именно это мне и посоветовали ЗДЕСЬ
Автор: AndrewVK
Дата: 09.11.04

дело в том что в МСДН для перебора элементов везде используют энумератор, что то вроде навязчивой рекламы...
Поэтому простейший способ вылетел из головы....
... <<silent Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[7]: удаление элементов ArrayList
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 09:50
Оценка:
Здравствуйте, Сантехник, Вы писали:

W>>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?


А ты вкурсе насколько твое вариант медленнее? Конечно любая модификация переменных чревата ошибками, но не до маразма же доводить? Эдак проще переходить на функциональные языки. Там как раз поощрается такой стиль.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: удаление элементов ArrayList
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 09:50
Оценка:
Здравствуйте, Wile, Вы писали:

W>Да это ясно, что за 3 секи, интересно просто, можно ли обойтись без компарера, и вообще без копирования


Перебирай в цикле и копируй в другой массив. А массовые удаления из середины действительно чреваты. Правдо, если удалений немного или они приемущественно сзади, то все эти компареты и полиморфные методы перебора тоже к тормозам приведут.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: удаление элементов ArrayList
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 09:50
Оценка:
Здравствуйте, Сантехник, Вы писали:


С>Можно пробегать по исходному списку и нужные элементы, т.е. те, которые не надо удалять, копировать в новый список, типа

С>
С>IList FilterList(IList sourceList, IComparer criteria)
С>


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

Тут как бы универсальных решений быть не может. Вернее конечно может, но специализированное будет всегда эффективнее.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 10.11.04 10:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А ты вкурсе насколько твое вариант медленнее? Конечно любая модификация переменных чревата ошибками, но не до маразма же доводить? Эдак проще переходить на функциональные языки. Там как раз поощрается такой стиль.


В обсуждаемом случае медленнее, не спорю, но если брать general-case, то имхо допустимо.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[2]: удаление элементов ArrayList
От: Аноним  
Дата: 10.11.04 10:17
Оценка: +1
Здравствуйте, kondrat_kiev, Вы писали:

_>А если использовать следующий код:

_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>

Так нельзя. Проверьте на любом примере — пропустит половину элементов. Здесь, скорее, подошло бы что-то вроде while.
Re[3]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 10.11.04 10:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Так нельзя. Проверьте на любом примере — пропустит половину элементов. Здесь, скорее, подошло бы что-то вроде while.


Так нет, но если после кажного удаления откатывать счетчик, то сработает.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[9]: удаление элементов ArrayList
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 11:08
Оценка:
Здравствуйте, Сантехник, Вы писали:

С>В обсуждаемом случае медленнее, не спорю, но если брать general-case, то имхо допустимо.


Да нет, я даже не ставлю под сомнение допустимость. Просто без оговорок такие предложения могут привести к несколько извращенному применению.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.