[Java] 자바 #44, String split(), StringTokenizer 클래스 ( 문자열 분리 , 쪼개기)

문자열 분리


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

}

결과 : 

이름 : 

이름 : 홍길동

이름 : 암우개

이름 : 호호호

이름 : 하하하

이름 : 테스테

이름 : 


댓글

Designed by JB FACTORY