2017-01-30 3 views
0

Этот метод должен удалить все вхождения значения toRemove из массиваList. Остальные элементы должны быть просто смещены в начало списка. (размер не изменится.) Все «лишние» элементы в конце (однако многие вхождения toRemove были в списке) должны быть просто заполнены 0. Метод не имеет возвращаемого значения, и если в списке нет элементов, это не должно иметь никакого эффекта. Нельзя использовать remove() и removeAll() из класса ArrayList.Понимание этого метода удаления метода с помощью массиваList

Метод подписи:

public static void removeAll(ArrayList<Integer> list, int toRemove); 

Решение:

public static void removeAll(ArrayList<Integer> list, int toRemove) { 
    for (int i = 0; i < list.size(); i++) { 
     if (list.get(i) = toRemove) { 
      for (int j = i + 1; j < list.size(); j++) { 
       list.set(j - 1, list.get(j)); 
      } 
      list.set(list.size() - 1, 0); 
      i--; 
     } 
    } 

Я понимаю, что первый цикл и если заявление хорошо. Поскольку нужно было бы итерации через весь массивList один за другим и для каждого индекса с числом, присутствующим в проверке arrayList, если оно есть, на самом деле целое число toRemovee. После этого я теряюсь.

Почему еще один цикл? Почему мы берем предыдущую переменную цикла и добавляем 1 к ней? Почему в этом втором цикле мы используем параметры «list» и используя метод set? почему j - 1? Почему list.get (j)? Почему после этого второго цикла есть строка: list.set (list. Sise() - 1, 0)? Почему i--?

Есть много движущихся частей, и я хотел бы понять логику.

Спасибо

+2

Это не скомпилировано. – shmosel

+0

* «Почему еще один цикл?» * Соответствует требованиям для * «Остальные элементы следует просто сдвинуть в начало списка» *. Может быть, вы должны прикрепить точку останова и пройти через код и посмотреть, как это изменяется. – MadProgrammer

+0

@MadProgrammer Спасибо. Я не понимаю, как он переходит к началу списка. – jun

ответ

0

Во-первых, операция, если оператор является назначение, которое не является правильным. Вам нужно изменить значение = на ==. Я объяснил каждый шаг в коде -

public static void removeAll(ArrayList<Integer> list, int toRemove) { 
    //start with the first number in the list until the end searching for toRemove's 
    for (int i = 0; i < list.size(); i++) { 
     //if the value at i is the one we want to remove then we want to shift 
     if (list.get(i) == toRemove) { 
      //start at the index to the right until the end 
      //for every element we want to shift it the element to its left (i == j - 1) 
      for (int j = i + 1; j < list.size(); j++) { 
       //change every value to whatever was to the right of it 
       //this will overwrite all values starting at the index where we found toRemove 
       list.set(j - 1, list.get(j)); 
      } 

      //now that everything is shifted to the left, set the last element to a 0 
      list.set(list.size() - 1, 0); 
      //decrement to adjust for the newly shifted elements 
      // this accounts for the case where we have two toRemoves in a row 
      i--; 
     } 
    } 
} 

К концу этой функции любое значение, которое соответствует toRemove будет «удален», сдвигая ArrayList в левой каждый раз значение будет найден и будет установлен последний элемент до 0.

Пример

removeAll([1,2,3,4,5,5,6,7,8,5,9,5], 5) 

Выходной

[1,2,3,4,6,7,8,5,9,0,0,0] 
+0

Большое спасибо! Я немного смущен тем, что делает j - 1, а размер() - 1. Эти две части вызывают у меня большую путаницу. – jun

0

Пле аза увидеть следующее, чтобы узнать подробности (от минуты 5:50 или 5:57)

https://www.youtube.com/watch?v=qTdRJLmnhQM

Вам нужен второй цикл, чтобы принять все элементы после элемента, который вы удалили его и перенести его на один слева, так что в основном он заполняет пространство, которое остается пустым, удаляя его, так что это то, что он делает.