2017-01-31 1 views
2

이 메소드의 역할은 arrayList에서 toRemove 값을 모두 제거하는 것입니다. 나머지 요소는 목록 시작 부분으로 이동해야합니다 (크기는 변경되지 않음). 끝에있는 모든 "추가"요소 (그러나 많은 경우는 toRemove이 목록에 포함됨)는 0으로 채워 져야합니다.이 메서드에는 반환 값이 없으며 목록에 요소가 없으면 아무런 효과가 없습니다. ArrayList 클래스의 remove()removeAll()을 사용할 수 없습니다.arrayList를 사용하는이 removeAll java 메소드의 이해

방법 서명은 다음과 같습니다

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--; 
     } 
    } 

내가 잘 첫 for 루프와 if 문을 이해합니다. arrayList 전체에 걸쳐 하나씩 반복하고 arrayList에있는 숫자가있는 각 인덱스에 대해 확인하려면 실제로 toRemovee 정수 여야합니다. 이 시점 이후에 나는 길을 잃는다.

왜 다른 for이 루프 되나요? 왜 우리가 두 번째를 시작합니까? for -loop one? 그 두 번째 이유는 for 루프는 list.set()을 사용합니다. set 메서드는 두 개의 인수, 즉 인덱스 위치와 그 지정된 위치에 속하는 요소를 사용한다는 것을 이해합니다. 왜 j-1일까요? 왜이 두 번째 루프가 끝난 후에는 list.set(list.size()-1, 0)? 왜 i--일까요?

많은 움직이는 부분이 있으며 논리를 이해하고 싶습니다.

는 당신에게 감사

+4

if (list.get (i) = toRemove)'=='을 (를) 작성 하시겠습니까? – Moira

+0

가능한 [arrayList를 사용하여이 제거 방법 솔루션 이해] (0120-387-304) –

답변

3

왜 다른 for -loop? 왜 우리가 두 번째를 시작합니까? for -loop one? 그 두 번째 for 루프 내에서 우리가 list.set()을 사용하는 이유는 set 메소드가 두 개의 인수, 즉 인덱스 위치와 그 지정된 위치에 속하는 요소를 취한다는 것을 이해합니다. 왜 j - 1일까요?

이 방법은 설명서의 모든 내용을 수행합니다. 내부 루프는 요소를 하나씩 왼쪽으로 이동합니다.

for (int j = i + 1; j < list.size(); j++) { 
    list.set(j - 1,  //The index before j (that is, j - 1) is set to... 
      list.get(j)); //the current element. 
    } 
} 

발견 된 색인 뒤의 요소에서 시작하여, 왼쪽 요소를 현재 요소로 설정합니다. 결국 모든 요소가 왼쪽으로 옮겨지게됩니다.

list.set(list.size() - 1, 0); 

마지막 요소를 0으로 설정합니다. 당신의 목록에는 하나의 요소가 제거되었으므로 모든 요소가 이동되었으므로 마지막 요소를 제거해야합니다.

예 :이 예에서

, 내가 ^이고 *j이다.

0 1 2 3 4 

내가 2 개를 제거하고 싶다고 말합니다.
첫째, 나는 루프 나는 모든 해당 요소를 제거하기 위해 왼쪽으로 이동합니다, 이제 2

0 1 2 3 4 
    ^index: 2 

을 찾을 때까지. 우리가 왼쪽으로 이동하고 있기 때문에, 우리는 따라서 for -loop가 i + 1에서 시작 (i + 1에서 시작해야합니다.

0 1 3 3 4 
    ^* (replaced the one before *) 

다음, 우리는 다시 할. 이제 우리는 완료

0 1 3 4 4 
    ^ * 

합니다.

list.set (는 list.size() - 1, 0);

그러나 끝 부분에 4가 남습니다. 요소를 제거했기 때문에이를 제거해야하며, 목록은 하나의 요소가 더 짧습니다. 따라서 마지막 요소를 0으로 설정하여 제거합니다 (물론 0은 목록에서 유효한 값이 아님을 가정합니다).

참고 :

난 강력하게 대신 set에 대한 호출의 list.remove(list.size() - 1)을하고 건의 할 것입니다. 이것은 실제로 마지막 항목을 제거하고 "마법 번호"기본값으로 남겨 두지 않습니다.

i--일까요?

모든 항목이 왼쪽으로 이동했기 때문에 i--이 필요하므로 색인 1을 왼쪽으로 업데이트해야합니다. 즉 1을 빼야합니다. (사실, 당신이해야 할 것은 같은 인덱스에 반복을 시작하지만 for -loop이 i++을 실행하기 때문에 모든 당신이 그것을 "취소"를 i--을 할 필요가 반복.)

0

왜 우리는 두 번째 for-loop one을 시작합니다.

선두로부터이 발견 될 때마다, 우리는 ArrayList에의 값 다음 (1) 모든 에 의해 왼쪽 시프트로합니다. for 루프 초 우리 list.set()를 사용하여 수행 내에

이유는, I는 방법은 두 인수 인덱스 위치, 그 지정된 위치에 하위에 요소를 가져 설정 이해한다. 왜 j - 1인가?

j-1은 왼쪽으로 1 시프트하는 데 사용됩니다.

왜이 두 번째 루프가 끝난 후에는 다음과 같은 행이 생깁니 까? list.set (list.sise() - 1,0)?

값을 왼쪽으로 시프트했지만 마지막 인덱스 (크기 -1)의 값이 아무 것도 대체되지 않았으므로 0이됩니다.

i--? 현재 인덱스의 값을 다른 값으로 덮어 쓴 것처럼

, 우리는 (i++ 보상 i--) 같은 인덱스에서 다음 반복을 시작합니다.

0

동일한 스타일을 FP 스타일로 사용하려는 경우; 입력을 수정하는 대신 새 List를 반환하면 Streams에서이를 수행 할 수 있습니다.

public static List<Integer> removeAll(ArrayList<Integer> list, int toRemove) { 
    Integer rem = new Integer(toRemove); // OR change toRemove to Integer 
    List<Integer> ret = list.stream() 
        .filter(i -> !(i.equals(rem))) 
        .collect(Collectors.toList()); 
    return ret; 
    //if you NEED to return ArrayList instead of List 
    //return new ArrayList<>(ret); 
} 
+0

들어오는 부분을 수정해야하는 경우 목록 : void를 반환하는 변경 메서드 및 'list.clear(); list.addAll (ret); return ret; ' – WillD