#java
#ява #java
Вопрос:
Возникли проблемы с определением этого метода для класса. Мне нужно написать метод, который принимает диапазон значений max и min и удаляет все элементы, содержащие эти значения. Например, если я введу в основной метод RemoveRange(список, 5, 7); в основном методе он должен принимать значения [7, 9, 4, 2, 7, 7, 5, 3, 5, 1, 7, 8, 6, 7] и превратить его в [9, 4, 2, 3, 1, 8] . Но я продолжаю получать [9, 4, 2, 7, 3, 1, 8, 7] когда я компилирую. Вот мой метод RemoveRange с параметрами.
public static void removeRange(ArrayList<Integer> list, int min, int max) {
for(int i = 0; i < list.size(); i ) {
if((list.get(i) >= min amp;amp; list.get(i) <= max)) {
list.remove(i);
}
}
}
Ответ №1:
Когда вы удаляете элемент из своего ArrayList
, индексы элементов, следующих за удаленным элементом, уменьшаются, поэтому ваш цикл пропустит следующий элемент на следующей итерации.
Вы можете учитывать это путем уменьшения i
при удалении элемента:
public static void removeRange(ArrayList<Integer> list, int min, int max) {
for(int i = 0; i < list.size(); i ) {
if((list.get(i) >= min amp;amp; list.get(i) <= max)) {
list.remove(i);
i--;
}
}
}
Или путем итерации в обратном направлении:
public static void removeRange(ArrayList<Integer> list, int min, int max) {
for(int i = list.size() - 1; i >= 0; i--) {
if((list.get(i) >= min amp;amp; list.get(i) <= max)) {
list.remove(i);
}
}
}
Ответ №2:
В вашем массиве 7, 9, 4, 2, 7, 7, 5, 3, 5, 1, 7, 8, 6, 7
итерация выглядит следующим образом -> Для простоты пусть диапазон будет от 7 до 7.
изначально i = 0, size = 14: 7 удаляется. размер = 13 нового массива — 9, 4, 2, 7, 7, 5, 3, 5, 1, 7, 8, 6, 7
теперь i = 1, size = 13: теперь вы получаете доступ к [1], т.Е. 4, поэтому 9 пропускается.
позже i = 3, size = 13, 7 удаляется. размер = 12 нового массива — 9, 4, 2, 7, 5, 3, 5, 1, 7, 8, 6, 7
теперь i = 4, size = 12: теперь вы получаете доступ к [4], т.е. 5, поэтому 7 пропускается.
надеюсь, что недостаток в вашей логике теперь виден вам. Попробуйте выполнять i = i-1 каждый раз, когда вы удаляете элемент.
Ответ №3:
Вы можете использовать Iterator
вот так.
public static void removeRange(ArrayList<Integer> list, int min, int max) {
for (Iterator<Integer> i = list.iterator(); i.hasNext();) {
int element = i.next();
if (element >= min amp;amp; element <= max)
i.remove();
}
}
и
ArrayList<Integer> list = new ArrayList<>(List.of(7, 9, 4, 2, 7, 7, 5, 3, 5, 1, 7, 8, 6, 7));
removeRange(list, 5, 7);
System.out.println(list);
вывод:
[9, 4, 2, 3, 1, 8]