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


참고자료