[Java] 자바 #44, String split(), StringTokenizer 클래스 ( 문자열 분리 , 쪼개기)
- 프로그래밍 언어/Java
- 2019. 3. 11. 23:12
문자열 분리
1. String split() 객체 메소드
- 정규 표현식 사용.
2. StringTokenizer 클래스
- 문자사용
StringTokenizer 클래스
String txt ="홍길동,아무개,하하하,호호호,후후후"; 콤마(,)로 구분된 문자열
StringTokenizer st = new StringTokenizer(txt, ",");
System.out.println(st.countTokens()); 5 그냥 토큰의 갯수라고 생각.
while(st.hasMoreTokens()) {
System.out.println(st.nextToken()); 하나의 토큰씩 반환
}
System.out.println(st.countTokens()); 0 탐색후 소비됨
txt="010-4846-4538";
st=new StringTokenizer(txt, "-");
while(st.hasMoreTokens()) {
System.out.println(st.nextToken()); 010 4846 4538
}
String 클래스의 split() 메소드 vs StrpingTokenizer 클래스
ex) 다음과 같은 문자열 배열이 있을 때!
String[] txt = new String[4];
txt[0]="홍길동,20,서울시,남자";
txt[1]="아무개,25,부산시,남자";
txt[2]="호호호,23,,여자";
txt[3]="하하하,,인천시,남자";
1. split()
- 구분자와 구분자 사이에 아무 데이터가 없어도 하나의 요소로 인정O (배열의 방을 만들어 준다.)
for(String line : txt) {
//분리
String[] temp = line.split(",");
for(String item : temp) {
System.out.print(item+"\t");
}
System.out.println();
}
System.out.println("===========================");
2. StringTokenizer 클래스
- 구분자와 구분자 사이에 아무 데이터가 없으면 하나의 요소로 인정X.
- 토큰(Token) : 공백이 없는 연속된 문자의 집합. -> 단어(공백문자 포함X)
for(String line : txt) {
StringTokenizer st = new StringTokenizer(line, ",");
while(st.hasMoreTokens()) {
System.out.print(st.nextToken()+"\t");
}
System.out.println();
}
결과
>> 어떤 차이인지 아시겠죠??
split()
- 장점 : 정규 표현식 사용 가능(다양하게 쪼갤 수 있다.)
- 단점 : 속도가 느리다.(정규표현식)
StringTokenizer(다량의 데이터)
- 장점 : 속도가 빠르다.
- 단점 : 정규 표현식 사용 불가능, 단순한 문자로만 쪼갤 수 있다. -> 원패턴
속도비교 예제
>> 100만개의 StringBuilder 클래스에 "홍길동,"이라는 문자열을 더한다. 그리고 각각 쪼개는 시간을 측정해보자!!
StringBuilder sb = new StringBuilder();
for(int i =0; i<1000000;i++) {
sb.append("홍길동,");
}
long begin=0,end =0;
begin = System.currentTimeMillis(); 시간측정
//1. split() 메소드
String[] temp = sb.toString().split(",");
for(String item : temp) {
item.length(); 접근(그냥 같은 과정을 처리한다고 생각하자)
}
end = System.currentTimeMillis();
System.out.println(end-begin);
//2. StringTokenizer 클래스
begin = System.currentTimeMillis(); 시간측정
StringTokenizer st = new StringTokenizer(sb.toString(), ","); 분리
while(st.hasMoreTokens()) {
st.nextToken().length(); 접근
}
end = System.currentTimeMillis(); 종료시간
System.out.println(end-begin);
780 split()
315 StringTokenizer 클래스
>> 결과 : StringTokenizer클래스가 속도면에서는 더 빠르다!
- 하지만 정규식이라는 고차원적인 기술을 적용하지 못한다는 단점과 함께한 단순한 패턴이 문제다.
- 어느정도 허용되는 선이라면 split() 메소드를 사용하는 것이 더 좋게 느껴질 때가 있을 것이다.
split() 살펴보기
String txt ="홍길동|아무개|김옥빈|주상욱|차태현";
- 자바의 split()은 |가 오면 구분자로 인식하지 않고 연산자 OR로 인식하게 된다.->동작 이상. -> [ ] 안에 | 를 넣어준다.
String[] temp = txt.split("|");
System.out.println(Arrays.toString(temp));
String[] temp2 = txt.split("[|]");
System.out.println(Arrays.toString(temp2));
결과 :
- split()은 앞의 구분자, 중간의 구분자는 인식하지만, 끝의 구분자는 인식하지 않는다.
txt=",홍길동,암우개,호호호,하하하,테스테,";
temp = txt.split(",");
for(String name : temp) {
System.out.println("이름 : "+name);
}
결과 :
그럼 StringTokenizer 클래스는???
StringTokenizer st = new StringTokenizer(txt, ",");
while(st.hasMoreTokens()) {
System.out.println("이름 : "+st.nextToken());
}
결과 :
- 정규식 사용
txt="홍길동,아무개--호호호^하하하";
temp=txt.split("[,-^]"); , 또는 - 또는 ^ 을 구분자로 하겠다.
for(String name : temp) {
System.out.println("이름 : "+name);
}
결과 :
>> 가운데가 비어있는 이유는 정규식 표현을 잘 보시고 txt를 잘 보시기 바랍니다.
- 원하는 길이 까지만 쪼갤 수 있다.
txt = "하나,둘,셋,넷,다섯,여섯,일곱";
temp = txt.split(",",4);
for(String name : temp) {
System.out.println("숫자 : "+name);
}
결과 :
둘
셋
넷, 다섯, 여섯, 일곱
System.out.println("원하는 길이까지만 쪼갤 수 있다.");
txt=",홍길동,암우개,호호호,하하하,테스테,";
temp = txt.split(",",-1); 음수가 들어가면 앞뒤 상관없이 그냥 , 을 구분자로 다쪼개버린다.
for(String name: temp) {
System.out.println("이름 : "+name);
}
결과 :
이름 :
이름 : 홍길동
이름 : 암우개
이름 : 호호호
이름 : 하하하
이름 : 테스테
이름 :
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 자바 #46, 람다식의 함수형 인터페이스 개념 및 예제 (0) | 2019.03.17 |
---|---|
[Java] 자바 #45, 람다식 예제 및 활용 (3) | 2019.03.16 |
[Java] 자바 #43, 정규표현식 설명 및 예제 (5) | 2019.03.10 |
[Java] 자바 #42, 익명객체(Anonymous Object) 개념 및 예제 (0) | 2019.03.09 |
[Java] 자바 #41, Scanner 객체 (0) | 2019.03.09 |