Проблемы с 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;
}