Проблемы с listiterator удалить Java

Я пытаюсь обработать проблему Джозефуса в структуре данных arrayList, и задача состоит в том, чтобы использовать ListIterator. Я застреваю на удалении части.

Допустим, у меня есть следующие 10 солдат - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 И я должен наступить на каждого 3-го солдата - что означает удалить 3, затем 6, затем 9 и т. Д.,

Я могу успешно удалить 3, но в следующий раз он удаляет 7, а не 6. Можете ли вы просмотреть мой код и сказать, что я делаю неправильно:

private static int suicide (List<Integer> list, int step) {

        ListIterator<Integer> itr = list.listIterator();

        while(itr.hasNext()&& list.size() != 1){

            if((itr.nextIndex()+1) % step == 0) {
                System.out.println(itr.previousIndex()+1);
                itr.next();
                itr.remove();
                itr.next();
            }
            else {
                itr.next();
            }

            if(!itr.hasNext() ){

                itr=list.listIterator();
            }
        }
        return 0;
    }

3 ответа

Верните вам логику дизайна!

Создание нового Списка только с принятыми элементами - это действительно лучший подход.

Удаление всегда труднее понять и поддерживать.

Например, вы, самоубийца, должны вернуть новый List<> с элементами, которые вы хотите.

Ваш код будет действительно проще:

List<Integer> cleanedList = new ArrayList<Integer>();
for(Integer soldier : list) {
    if(solider%3!=0){
        cleanedList.add(soldier); 
    }     
}
return cleanedList;

Большую часть времени я предпочитаю API, который создает новые объекты. Если вы применяете это правило, ваш код всегда будет проще! И обновление параметров не является хорошим поведением: если вы вызываете метод дважды, вы получаете два разных результата.

Одна возможность состоит в том, что вы создаете копию списка и удаляете элементы в этой копии, продолжая повторять "оригинал" (и пропуская шаг итератора в копии).

ListIterator itr = list.listIterator (); ListIterator itr2 = copy.listIterator ();

while(itr.hasNext()&& list.size() != 1){

    if((itr.nextIndex()+1) % step == 0) {
        System.out.println(itr.previousIndex()+1);
        itr.next();
        itr2.next();
        itr2.remove();
        itr.next();
    }
    else {
            itr.next();
            itr2.next();
        }

Попробуй это;

int i = 3;
int step = 1;

while (list.size()  > i) {
    list.remove(i);
    step++;
    i = 3 * step - step + 1; 
}
Другие вопросы по тегам