물에 살고싶은 개발자

[ArrayList] 사용 시 간과하기 쉬운 것 본문

Java

[ArrayList] 사용 시 간과하기 쉬운 것

돼지사랑 2017. 10. 10. 20:57

아마 여러개의 데이터를 다루면서 가장 많이쓰는게 ArrayList가 아닐까 싶다.(아님말고ㅋ)


그만큼 ArrayList는 쉽게쉽게 쓸수있으면서도 유연하게 사용할 수 있는 자료구조라서 코딩을 하는 사람이라면


누구나 잘 다룬다고 생각하지만 간과하기 쉬운, 근데 의외로 문제를 찾기 어려울 수도 있는 부분을 오늘 발견했다(는 삽질했다는 얘기지..ㅎㅎ..)



아무튼!! 


간혹 특정한 인덱스들을 여러개 삭제하고 싶을때 우리는


간단하게 구현하기 위해 ArrayList.remove(index)를 사용하는 경우가 있을것이다.


ArrayList<Integer>로 리스트를 구현해서 삭제할 인덱스를 잔뜩 넣어놓고 


반복문을 돌려서 삭제하려는 로직을 사용할때 삭제가 안되는 경우가 있다.


코드로 보자면,

public void deleteOnSelectItems(ArrayList<Integer> indexes) {
for (int i = 0; i < indexes.size(); i++) {
items.remove(indexes.get(i));
}
}

요렇게 심플한 코드로 나올 수 있겠는데, 아무 문제가 없어보이지만, 반복문 앞뒤로 리스트의 길이를 로그로 찍어보고 

삭제할 인덱스를 remove의 위아래로 찍어봐도 삭제가 안되는것을 확인 할 수 있다.


이렇게 하면 remove() 함수로 보내는 매개변수인 indexes.get(i)가 int로 나오는게 아니라 Integer로 나와버린다.

때문에 로그로 찍어봐도 우리눈엔 똑같은 정수 n으로 보이는데, 실제로는 삭제가 안된다.


그러므로 코드를 아래처럼 바꿔주자

public void deleteOnSelectItems(ArrayList<Integer> indexes) {
for (int i = 0; i < indexes.size(); i++) {
int deleteIndex = indexes.get(i);
items.remove(deleteIndex);
}
}


아니면 아예 파싱을 해버리던가..ㅋ...


잘 생각해보면 이게 꼭 remove에서만 벌어지는 일이 아닐 수도 있다는것 알아두자


Comments