В Java конструктор не является методом. Он имеет только имя класса и определенную видимость. Если он объявляет, что возвращает что-то, то он не является конструктором, даже если он объявляет, что возвращает void
. Обратите внимание на разницу здесь:
public class SomeClass {
public SomeClass() {
//constructor
}
public void SomeClass() {
//a method, NOT a constructor
}
}
Кроме того, если класс не определяет конструктор, то компилятор автоматически добавит для вас конструктор по умолчанию.
При вызове 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), поскольку первый объект не должен быть скопирован в себя. Это делает код немного менее очевидным все же.
Только для рассмотрения решения, которое создает новый список со списком, старым, Вы могли сделать это:
var newList = old.Where((_, i) => i%2 != 0).ToList();
или, очевидно
var newList = l.Where((_, i) => i%2 == 0).ToList();
завися, какое чередование Вы выбираете.
Править
Ответ вполне немного более быстр. При чтении чего-то еще здесь это - потому что я имел размеры в выходные и выходные мозг забавен.:( Решение для закрытия приблизительно на 40% более быстро, в то время как ответ является приложением. 2 порядка величины быстрее. Я предполагаю, что это будет действительно зависеть, как большой Ваш список становится!
Я не уверен, что Вы подразумеваете под альтернативой, но если Вы подразумеваете, что "любой объект" следующий код будет работать. Это запустится путем удаления 2-го элемента, затем 4-е, и так далее
List<T> list = GetTheList();
int i = 1;
while ( i < list.Count ) {
list.RemoveAt(i);
i++;
}
И другая опция, подобная одной Frank's, но с использованием закрытий. И это более быстро, чем версия Frank's.
bool isEven = true;
var newList = list.Where(x => isEven = !isEven).ToList();
Очевидно, зависимый использования, но у Вас могла быть обертка IList, который умножает индекс, который Вы даете ему 2, и сообщает, что длина списка 1/2 (игнорируемые детали). Это - O (1).
Я использовал бы стандартный шаблон, обычно используемый для контейнеров 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());
}
for (int i=myList.length-1; i >= 0; i--)
if (i % 2 == 0)
myList.Remove(myList[i]);
Путь к Нирване проложен с задержанным выполнением. Или что-то.
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<>
. Стоимость повторения задерживается до повторения, которое может быть большой победой, если в конце Вы не должны касаться всех элементов в списке.
В моих простых тестах производительность, когда Вы выполняете итерации по целому списку, не очень хороша, так убедиться представить Вашу реальную ситуацию.