▸JAVA/라이브러리(API)

java.lang.String (문자열) 주요 메소드 [2/4]

코데방 2019. 12. 10.
728x90

[ indexOf() ]

  • 원하는 인덱스(위치)부터 앞에서 뒤로 순서대로 문자열 검색
  • 원하는 인덱스를 명시하지 않으면 가장 앞에서부터 뒤로 검색
  • 해당 문자열이 있으면 해당 인덱스를, 없으면 -1 반환 (boolean 타입이 아닌 int 타입 반환)
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Hello World");
		System.out.println(a.indexOf("H"));     // 0
		System.out.println(a.indexOf("H", 5));  // -1 (앞에서 다섯 번째 글자부터 검색)
		System.out.println(a.indexOf("h"));     // -1			
	}
}

 


 

[ lastIndexOf ]

  • indexOf와 동일하지만 뒤에서부터 검색
  • 인덱스를 명시하지 않는다면 indexOf와 동일한 결과
  • 인덱스를 명시한다면 뒤에서부터 해당 글자부터 앞으로 검색하므로 다른 결과
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Hello World");
		System.out.println(a.lastIndexOf("H"));    // 0
		System.out.println(a.lastIndexOf("H", 5)); // 0 (뒤에서 다섯 번째 글자부터 검색)
		System.out.println(a.lastIndexOf("W", 5)); // -1 (뒤에서 다섯 번째 글자부터 검색)
		System.out.println(a.lastIndexOf("h"));    // -1
	}
}

 


 

[ startsWith() ]

  • 찾는 문자열이 시작부분과 일치하는지 검색
  • indexOf() 와 달리 boolean 타입으로 반환
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Hello World");
		System.out.println(a.startsWith("H"));	// true
		System.out.println(a.startsWith("h"));	// false
	}
}

 


 

[ endsWith() ]

  • 찾는 문자열이 문자열의 끝과 일치하는지 검색
  • boolean 타입 반환
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Hello World");
		System.out.println(a.endsWith("d"));	// true
		System.out.println(a.endsWith("D"));	// false
	}
}

 


 

[ concat() ]

  • 새로운 문자열 추가
  • 실제 추가가 아닌 다른 문자열 인스턴스를 생성 후 메모리 주소를 반환해줌
  • +기호를 통해 문자열을 추가해주는 것과 동일함
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Hello");
		a = a.concat(" World1");
		System.out.println(a);	// Hello Wolrd1

		a += " World2";         // concat 메소드와 동일
		System.out.println(a);	// hello World1 World2
	}
}

 


 

[ replace() / replaceAll() ]

  • 특정 문자열을 교체
  • replace()는 문자열을 찾는 기준이 일반 문자열만 사용 가능
  • replaceAll()은 문자열을 찾는 기준으로 정규표현식 사용 가능
  • 원본문자열 갯수에 상관없이 모두 바꿔줌, 시작 → 끝 순서로 검색
		String a = new String("Apple");
		a = a.replace("le", "앙");
		System.out.println(a);			// "App앙"
		
		String b = new String("Appple");
		b = b.replaceAll("[le]", "앙");	
		System.out.println(b);			// "Appp앙앙"

 


 

[ replaceFirst() ]

  • 시작 → 끝 순서로 검색하며 첫 번째 검색된 문자열을 바꿔줌
  • 찾을 문자열은 정규표현식으로 지정 가능
  • 반대 순서로 검색해서 바꿔주는 메소드는 없음 (직접 만들어야 함)
package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Apple");
		a = a.replaceFirst("p", "b");
		System.out.println(a);			// "Abple"
	}
}

 


 

[ replaceEnd() - 기본 메소드 아님 ]

  • replaceFirst만 있어서 말나온김에 반대 로직을 만들어봄 (정규표현식 제외)
  • 끝 → 시작 순서로 끝부터 검색해서 첫번째 검색값을 바꿔줌
  • 아직 자바에 익숙하지 않아서 최적화 처리 없이 일단 짜봄
  • 자바에서는 C처럼 문자열 끝처리를 '\0' 캐릭터로 하지 않는 것을 발견 (불편함..)
  • 라빈 카프 알고리즘 사용 (해시값 이용)

2019/12/09 - [C언어/알고리즘 및 자료구조] - 문자열 찾기(매칭)_라빈 카프 알고리즘 [2/2]

 

package study.first;

public class Study {

	public static void main(String[] args) {

		String a = new String("Apple");
		String b = replaceEnd(a, "p", "XX");
		
		System.out.print("p를 XX로 바꿈 : " + a + " → ");
		
		if (b != null)
			System.out.println(b);
		else 
			System.out.println("찾는 문자열이 없습니다.");

	}
	
	/* 끝 → 시작점 순서로 문자열 찾아서 첫 검색 값을 바꿔줌 */
	/* 원본 문자열, 찾을 문자열, 바꿔줄 문자열 */ 
	static String replaceEnd(String oldStr, String findStr, String newStr) {

		int findPoint = findStr.length(); // 찾을 문자열 길이
		int oldPoint = oldStr.length(); // 원본 문자열 길이

		/* 찾을 문자열이 더 길면 null값 반환 */
		if (findPoint > oldPoint)
			return null;

		/* 초기 해시값 생성 */
		int j = 2;
		int oldHash = 0, findHash = 0;
		for (int i = 0; i < findStr.length(); i++) {

			findHash += findStr.charAt(--findPoint) * j;
			oldHash += oldStr.charAt(--oldPoint) * j;
			j *= 2;
		}
		j /= 2; // 자리값 맞춰줌

		int w, f = oldStr.length();
		/* 뒤에서부터 같은 문자열 찾기 */
		while (oldPoint >= 0) {

			/* 찾을 경우 */
			if (findHash == oldHash) {

				/* 임시 저장소 생성 */
				char[] temp = new char[oldStr.length() + newStr.length()];
				int start2 = oldPoint + findStr.length();

				/* 검색 앞 문자 복사 */
				for (w = 0; w < oldPoint; w++)
					temp[w] = oldStr.charAt(w);

				/* 새로운 문자 복사 */
				for (int i = 0; i < newStr.length(); i++, w++)
					temp[w] = newStr.charAt(i);

				/* 남은 문자 복사 */
				for (int i = start2; i < oldStr.length(); i++)
					temp[w++] = oldStr.charAt(i);

				return String.valueOf(temp, 0, w);
			}
			
			/* 해시값 재계산 */
			oldHash -= oldStr.charAt(--f) * 2;
			oldHash /= 2;
			oldHash += oldStr.charAt(--oldPoint) * j;			
		}

		/* 못찾았을 경우 */
		return null;
	}
}
728x90

댓글

💲 추천 글