Метод RemoveRange с ArrayList

#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]