[Java] ArrayList에서 for문(for-each)을 사용할 때 Index 가져오기
업데이트(2019.03.15): 사례 추가 및 객체를 이용한 코드로 변경
Java List에서 for문을 사용할 때 index를 가져오는 방법을 알아보자
환경
- Java
상황
- for-each문을 이용해 반복문을 실행할 때 객체의 index를 알고 싶은 상황
- 앱을 개발할 때 sqlite3를 통해서 음악 자료들을 가져와서 ArrayList에 객체로 담아두었을 때 특정 조건에 해당하는(조건문을 통해) 객체들의 Index를 가져오고 싶은 상황에서 아래 코드로 개선하였습니다.
- 사실, for-each가 아닌 일반적인 for문을 이용하면 해당 i번째를 index로 이용하면 됩니다.
- 다음 아래와 같은 Class가 있고 해당 Class로 객체를 만들었다고 가정
public class Test{
String name;
String strVal;
int intVal;
public Test(){
}
public Test(String name, String strVal, int intVal){
this.name = name;
this.strVal = strVal;
this.intVal = intVal;
}
}
(방법1) ArrayList에서 객체의 index 가져오기
index 변수를 이용
- 반복문을 진행하기 전에 index라는 변수를 선언하고 반복문을 진행하면서 index를 증가시킵니다.
// 객체들을 담는 리스트
ArrayList<Test> arrayList = new ArrayList<Test>();
// index를 저장할 리스트(특별한 용도는 없이 본문에서는 index를 저장하기 위해 사용)
ArrayList<Integer> arrayIndexList = new ArrayList<Integer>();
// index 변수를 선언
int index = 0;
for (Test element : arrayList){
if(element.intVal == 3){
arrayIndexList.add(index);
}
// index 증가
index++;
}
(방법2) ArrayList에서 객체의 index 가져오기
indexOf 함수를 이용
- 특정 객체를 참조하는 변수가 있을 때 해당 변수를 사용하면
indexOf(객체변수)
를 이용해서 해당 객체의 index를 자료구조 안에서 찾을 수 있습니다. indexOf()
함수는 자료구조에서 하나하나 객체와 비교해가면서 값을 찾기 때문에O(n)
의 복잡도를 갖게 되며for-each
를 사용할 때 객체의 index를 알고 싶다면 위에 (방법1)을 쓰는 방향이 좋다고 합니다.
// 객체들을 담는 리스트
ArrayList<Test> arrayList = new ArrayList<Test>();
// index를 저장할 리스트(특별한 용도는 없이 본문에서는 index를 저장하기 위해 사용)
ArrayList<Integer> arrayIndexList = new ArrayList<Integer>();
for (Test element : arrayList){
if(element.intVal == 3){
// 아래처럼 indexOf(객체) 함수를 이용
arrayIndexList.add(arrayList.indexOf(element));
}
}
참고자료
- https://stackoverflow.com/questions/3431529/java-how-do-i-get-current-index-key-in-for-each-loop
- https://stackoverflow.com/questions/477550/is-there-a-way-to-access-an-iteration-counter-in-javas-for-each-loop
- https://stackoverflow.com/questions/3329842/how-to-get-the-current-loop-index-when-using-iterator
- https://docs.oracle.com/javase/7/docs/api/java/util/List.html