[Java] 자바 IndexOf로 모든 위치 찾는 방법

    IndexOf는 문자열에서 특정 단어가 있는지를 찾고 있을 경우 위치값을 리턴하는 내장 함수이다. 위치값은 0부터 시작하기 때문에 0 이상값이 나오면 결과가 리턴이 되고, -1인 경우 해당 값이 없을 경우이다. 그러나 이 메소드는 위치값을 찾을 경우 그 자리에서 종료를 하기 때문에 별도의 처리를 해야 모든 위치를 찾을 수 없다.

     

    자바에서 indexOf 모두 찾기

     

    내가 검색을 못한건지, 아직 모든 위치를 리턴하는 함수를 찾지 못하였다(혹시나 indexOfAll같은 것이 있나 싶었지만...) 비슷한 역할을 하는 함수로 contains가 있는데 이는 값이 있는지 여부를 찾으며, true, false로 리턴하는 함수이기 때문에 indexOf보다 범용적이지 못하다.

     

    모든 위치 찾기 예제

    public static void main(String[] args) {
    	String document = "삼성전자 LG전자 화웨이 소니 애플 삼성전자(우) 삼성화재";
    	String word = "삼성";
    	
    	System.out.println(findIndexes(word, document));
    }
    	
    public static List<Integer> findIndexes(String word, String document) {
    	List<Integer> indexList = new ArrayList<Integer> ();
    	int index = document.indexOf(word);
    	
    	while(index != -1) {
    		indexList.add(index);
    		index = document.indexOf(word, index+word.length());
    	}
    	
    	return indexList;
    }

    우선, 처음 indexOf로 노멀하게 한번 찾는다. 값이 있을 경우 index는 -1이 아닌 0이상값이 나올테니 while 루프문에 진입하게 된다. 진입 하자마자, list에 index 위치값을 세팅하며, indexOf에 2개의 인자, 단어와 from 위치값에 index+word.length()를 더한다. from 위치값의 경우 찾는 시작 위치를 지정한 것이다. 

     

    값을 또 찾을 경우 마찬가지로 index에 세팅이 되며 while문을 한번 더 돌 것이고, 또 찾지 못할 경우 while문은 종료하며 indexList를 리턴한다.

     

    예제실행 결과

    [0, 20, 28]

    위 예제를 실행하면 0, 20, 28과 같이 3번 나온것을 알 수 있으며, 모두 삼성이 나온 위치가 맞다는 것을 알 수 있다.

     

     

    반응형

    댓글

    Designed by JB FACTORY