Удаление альтернативных элементов в списке

В Java конструктор не является методом. Он имеет только имя класса и определенную видимость. Если он объявляет, что возвращает что-то, то он не является конструктором, даже если он объявляет, что возвращает void. Обратите внимание на разницу здесь:

public class SomeClass {
    public SomeClass() {
        //constructor
    }
    public void SomeClass() {
        //a method, NOT a constructor
    }
}

Кроме того, если класс не определяет конструктор, то компилятор автоматически добавит для вас конструктор по умолчанию.

18
задан abhilash 7 March 2009 в 13:39
поделиться

8 ответов

При вызове RemoveAt для каждого объекта, Вы удаляете, Вы будете перемещать много данных. Самое эффективное должно переместить объекты вместе, что Вы хотите сохранить, затем удалите неиспользованные объекты в конце:

int pos = 0;
for (int i = 0; i < values.Count; i += 2, pos++) {
    values[pos] = values[i];
}
values.RemoveRange(pos, values.Count - pos);

Править:
Этот метод обработает список миллиона ints в 15 мс. Используя RemoveAt это примет три минуты...

Edit2:
Вы могли на самом деле запустить с pos=1 и i=2 (или 3), поскольку первый объект не должен быть скопирован в себя. Это делает код немного менее очевидным все же.

27
ответ дан 30 November 2019 в 06:39
поделиться

Только для рассмотрения решения, которое создает новый список со списком, старым, Вы могли сделать это:

var newList = old.Where((_, i) => i%2 != 0).ToList();

или, очевидно

var newList = l.Where((_, i) => i%2 == 0).ToList();

завися, какое чередование Вы выбираете.

Править

Ответ вполне немного более быстр. При чтении чего-то еще здесь это - потому что я имел размеры в выходные и выходные мозг забавен.:( Решение для закрытия приблизительно на 40% более быстро, в то время как ответ является приложением. 2 порядка величины быстрее. Я предполагаю, что это будет действительно зависеть, как большой Ваш список становится!

9
ответ дан 30 November 2019 в 06:39
поделиться

Я не уверен, что Вы подразумеваете под альтернативой, но если Вы подразумеваете, что "любой объект" следующий код будет работать. Это запустится путем удаления 2-го элемента, затем 4-е, и так далее

List<T> list = GetTheList();
int i = 1;
while ( i < list.Count ) {
  list.RemoveAt(i);
  i++;
}
2
ответ дан 30 November 2019 в 06:39
поделиться

И другая опция, подобная одной Frank's, но с использованием закрытий. И это более быстро, чем версия Frank's.

bool isEven = true;            
var newList = list.Where(x => isEven = !isEven).ToList();
5
ответ дан 30 November 2019 в 06:39
поделиться

Очевидно, зависимый использования, но у Вас могла быть обертка IList, который умножает индекс, который Вы даете ему 2, и сообщает, что длина списка 1/2 (игнорируемые детали). Это - O (1).

1
ответ дан 30 November 2019 в 06:39
поделиться

Я использовал бы стандартный шаблон, обычно используемый для контейнеров STL. Сделайте удаление, сопровождаемое стиранием.

Таким образом, Вы не смутите людей, которые привыкли видеть этот шаблон.

template<typename T>
struct RemoveEven
{
    RemoveEven():count(0)   {}
    bool operator()(T const&)
    {
        bool    result  =  count%2 == 0;
        count++;
        return result;
    }
    private:
        std::size_t count;
};
int main()
{
    std::list<int>  a;
    a.erase(std::remove_if(a.begin(),a.end(),RemoveEven<int>()),a.end());

}
0
ответ дан 30 November 2019 в 06:39
поделиться
for (int i=myList.length-1; i >= 0; i--)
  if (i % 2 == 0)
    myList.Remove(myList[i]);
1
ответ дан 30 November 2019 в 06:39
поделиться

Путь к Нирване проложен с задержанным выполнением. Или что-то.

    public static IEnumerable<T> AlternateItems<T>(this IEnumerable<T> source)
    {
        while (source.Any())
        {
            yield return source.First();

            source = source.Skip(1);

            if (source.Any()) source = source.Skip(1);                
        }
    }

Это работает на все последовательности, не просто IList<>. Стоимость повторения задерживается до повторения, которое может быть большой победой, если в конце Вы не должны касаться всех элементов в списке.

В моих простых тестах производительность, когда Вы выполняете итерации по целому списку, не очень хороша, так убедиться представить Вашу реальную ситуацию.

2
ответ дан 30 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: