참고 도서 |
"입력되는 스트링은 통신 장비들 사이의 구성 관계 트리를 나타내는 값이다"그런데 문제는 입력하는 사람들의 실수로 빈칸이 입력되는 경우가 많다는 것이었다. 그래서 결국 빈칸을 없애는 코드를 다음과 같이 작성하게 되었다.
"각 노드의 구분은 슬래시(/)로 구분된다"
"스트링 사이에 빈칸은 존재해서는 안된다"
예: "cen99/con06/rnc06/bts00/BCCA00"
public static String removeAllChar(String in, char c) { String regex = "\\" + new Character(c).toString(); return in.replaceAll(regex, ""); // since JDK 1.4 }처음부터 끝까지 문자 c로 매치되는 것을 스트링 ""으로 변환하는 코드이다. 따라서 모든 문자 c가 제거되는 효과를 나타낸다. 테스트 코드는 다음과 같다.
// 고의로 중간에 빈칸이 삽입된 스트링 String s1 = " cen99/con06 /rnc06/bts00/BCCA00 "; String r1 = removeAllChar(s1, " "); System.out.println("before removeAllChar() => [" + s1 + "]"); System.out.println("after removeAllChar() => [" + r1 + "]");결과는 다음과 같은 형태로 나타난다.
… before removeAllChar() => [ cen99/con06 /rnc06/bts00/BCCA00 ] after removeAllChar() => [cen99/con06/rnc06/bts00/BCCA00] …정규 표현식을 사용하지 않는 경우
public String removeAllChar2(String in, char c) { StringBuffer buffer = new StringBuffer(); for (int i = 0 ; i < in.length() ; i++) { if (in.charAt(i) != c) { buffer.append(in.charAt(i)); } } return buffer.toString(); }정규 표현식을 사용하지 않고 StringBuffer 클래스를 사용하였다. 코드는 좀더 복잡해 보이지만 결과는 동일하다.
[그림 1] 수행시간 비교
… String s1 = ""; for (int i = 0 ; i < 2000 ; i++) { // 테스트를 위해서 일부러 빈칸을 넣어 보았다. s1 = s1 + " cen99/con06 /rnc06/bts00/BCCA00 "; } startTime = System.currentTimeMillis(); // 시작 시간 String r1 = removeAllChar(s1, " "); endTime = System.currentTimeMillis(); // 종료 시간 System.out.println(endTime - startTime); // 수행 시간 …입력되는 스트링의 값이나 길이, 표현식에 의해서 결과는 다르게 나올 수 있다. 여러분도 다른 방법으로 성능을 비교하면서 결과를 예상해보기 바란다.
"파일의 절대 경로에서 상위 경로를 제외한 파일이나 디렉토리 자체의 이름만을 가져와라"즉, "C:\wos\config\aokey\trace030217.log"와 같은 파일의 경로가 있을 경우 원하는 결과는 "trace030217.log" 이다.
1: public String removeParentPath(String in) { 2: String os = System.getProperty("os.name"); 3: String regex = null; 4: if (os.startsWith("SunOS")) { // Solaris 5: regex = "^.*/"; 6: } 7: else if (os.startsWith("Windows")) { // Windows 8: regex = "^.*\\\\"; 9: } 10: else { 11: // Unknown os 12: return null; 13: } 14: in = in.replaceFirst(regex, ""); 15: return in; 16: }예제에 사용되는 정규 표현식에 대해 궁금하다면 참고 도서 『정규 표현식 완전 해부와 실습(개정판)』의 274페이지를 참고하기 바란다. 주의 할 사항은 5, 8번째 줄에서 운영체제에 따라 파일과 디렉토리를 구분하는 문자가 다르다는 것이다. 실행을 위해서 아래와 같은 코드를 작성했다.
String s3 = "C:\\wos\\config\\aokey\\trace030217.log"; String r3 = removeParentPath(s3); System.out.println("before => [" + s3 + "]"); System.out.println("after => [" + r3 + "]");결과는 다음과 같은 형태로 나타난다.
… before => [C:\wos\config\aokey\trace030217.log] after => [trace030217.log] …정규 표현식을 사용하지 않는 경우
public String removeParentPath(String in) { String separatorChar = System.getProperty("file.separator"); return in.substring(in.lastIndexOf(separatorChar)+1 , in.length()); }이번에는 정규 표현식을 사용하지 않는 경우의 코드가 훨씬 간결해 보인다. 물론 결과는 동일하다. 이번 예제의 성능 비교는 여러분이 직접 해보길 바란다. 이번에도 정규 표현식을 사용하지 않은 경우가 더 빠르리라 예상된다.
이전 글 : 자바 스윙: 메뉴와 툴바 - 제 2편
최신 콘텐츠