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
'▸JAVA > 라이브러리(API)' 카테고리의 다른 글
java.lang.StringBuilder (문자열) 주요 메소드 [1/2] (2) | 2019.12.10 |
---|---|
java.lang.String (문자열) 주요 메소드 [4/4] (2) | 2019.12.10 |
java.lang.String (문자열) 주요 메소드 [3/4] (0) | 2019.12.10 |
java.lang.String (문자열) 주요 메소드 [1/4] (3) | 2019.12.10 |
java.lang.Object 주요 메소드 [1/1] (4) | 2019.12.10 |
댓글