문자열의 줄 수를 구하는 코드

프로그래밍 2007.09.04 03:18
  제가 필요해서 만들어 본 짧막한 자바코드 입니다.

  지금 만들고 있는 게시판에 필요해서 짜 본 코드이거든요. 이 짧막한 코드가 하는 일은 아주 간단합니다. 파라메터로 문자열을 넣어주면 그 문자열이 몇 줄 짜리인지를 알아내서 int형으로 리턴해줍니다.


public class Utility{
    public static int getLineNum(String content){
        int linenum = 0;
        int point = 0;
        int endcheck = content.lastIndexOf ('\n');
        while(true){
            point = content.indexOf('\n', point);
            linenum++;
            if(endcheck == point++) break;
        }
        return linenum;
    }
}

  필요한 곳에서 Utility.getLineNum(str); 요론 식으로 사용하기 위해서 정적 메소드로 선언해 두었습니다. 객체를 생성해서 사용 할 필요까지는 없어서요. 필요한 것은 저 메소드 하나이기 때문에...

  코드는 매우 간단합니다.

  • endcheck변수에 문자열의 마지막 줄바꿈의 인덱스번호를 넣어둡니다.
  • 루프 속에서 point변수에 문자열의 앞 부분부터 줄바꿈의 위치를 찾아갑니다.
  • 줄바꿈을 한 개 찾을 때 마다 linenum변수에 찾은 개수를 늘려갑니다.
  • if문에선 지금 찾아낸 줄바꿈의 인덱스와 마지막 줄바꿈의 인덱스를 가지고 있는 endcheck와 비교를 합니다.
  • 지금 찾은 인덱스가 마지막 인덱스와 같다면 break;
  • 마지막으로 linenum을 리턴하게 되는데, linenum은 줄바꿈이 없을 때 1, 1번 줄 바꿈이 있을 때 2를.. 이런 방식으로 문자열의 줄 수를 리턴하게 됩니다.

  if문 안에서 point++을 하기 싫다면 다음 라인에 point를 증가시키는 코드를 추가 해 줘야 합니다.

  증가시켜 주지 않는다면 point는 계속 한 곳의 인덱스만을 가르키며 while문이 무한루프하게 됩니다. 또한 if문 안에서 ++point로 바꾸게 되면 endcheck와 같은 값이 나오지 않게되어 while문이 무한루프에 빠지게 됩니다.

  간단한 코드 이지만 이걸 만들면서 잠시동안 재미 있었어요^^S

Update 2007/9/4

public static int getLineNum(String content){
    int linenum = 0;
    for(int i = 0; i < content.length(); i++){
        if('\n' == content.charAt(i)) linenum++;
    }
    return linenum;
}


  sonegy님이 달아주신 댓글을 보고 메소드를 새로 만들었습니다. charAt()메소드를 사용하면 훨씬 간단하게 만들 수 있는데 먼 길로 돌아서 코드를 만들었네요...;;

  코드를 만들때 머릿속에 indexOf()가 먼저 떠올라서 다른 방법을 생각할 수 없게 되었었습니다...ㅠㅠ

  이게 코드도 짧고 훨씬 낫네요..ㅎㅎ

'프로그래밍' 카테고리의 다른 글

에어론체어 갖고싶다~~  (18) 2007.09.24
스트럿츠로 게시판 작업중  (0) 2007.09.18
문자열의 줄 수를 구하는 코드  (8) 2007.09.04
대단하다 스팸!!  (4) 2007.09.03
맥 OS X 오라클  (6) 2007.08.27
학교에서 배운 지식은 죽은 지식이다??  (4) 2007.08.20
top
  1. Favicon of http://sonegy.egloos.com sonegy 2007.09.04 10:47 신고 수정/삭제 댓글

    String 객체의 lastIndexOf 보단 charAt으로 char값을 비교해서 count하는게 더 보기 좋을듯하네요.
    음 근데 Utility 객체가 저러다 수퍼클래스가 되지 않을까 걱정입니다~~

    • Favicon of http://signpen.net 싸인펜 2007.09.04 15:19 신고 수정/삭제

      오오!! 감사합니다!!

      머리가 나빠서 charAt()를 사용하는 방법을 미처 생각하지 못했었네요.
      코드가 훨씬 간단하고 보기좋고 더불어 효율적으로 바뀌었습니다^^ㅋ

      그런데 Utility객체가 수퍼클래스가 된다는게 무슨 말씀인지 잘 모르겠습니다...;;;

  2. Favicon of http://www.myhyuny.net/ 화현 2007.09.05 01:32 신고 수정/삭제 댓글

    음, 조금 특이한 방법으로 만들어 봤어요
    public static int getLineNum(String content){
    int linenum = -1;
    for(int temp=1; temp > 0; linenum++){
    temp = content.indexOf("\n", temp) + 1;
    }
    return linenum;
    }
    하지만 속도와 효율성을 봐서는 싸인펜님이 2번째로 만든 코드가 더 낳아보이네요 ㅎㅎ

  3. Favicon of http://mewmew.tistory.com/ 야옹*^^* 2007.09.05 17:21 신고 수정/삭제 댓글

    오호.. 대단하신분들이세요. @.@

    • Favicon of http://signpen.net 싸인펜 2007.09.06 02:40 신고 수정/삭제

      야옹님, 칭찬 감사합니당~~

      대단하신 분들이라고 하시지 말고 저 대단하다고 해 주세요~~ 징징~~
      (칭찬에 목마른 1人, 이 댓글은.. 조크입니다)

  4. Favicon of http://luminance.kr/ 루미넌스 2007.09.14 17:56 신고 수정/삭제 댓글

    시스템에 따라서는 줄바꿈에 \n을 사용하지 않는 경우도 있습니다^^
    \n는 LineFeed문자이구요.. \r이라는 CarriageReturn 문자도 있죠.. 도스, 윈도우계열은 통상 \r\n을 줄 끝에 넣구요.. 유닉스 계열은 통상 \n을 넣습니다.
    하지만 정확히 기억안나는 모종의 시스템은 \r만을 씁니다. ^^

    • Favicon of http://signpen.net 싸인펜 2007.09.18 01:15 신고 수정/삭제

      예전에 소켓통신 관련 부분을 공부할 때 \r\n과 \n 등을 써먹었던게 기억이 납니다. \r만 사용하는 시스템도 있었군요^^ㅋ

      루미넌스님의 댓글엔 항상 정보가 담겨있는 것 같아요^^ㅋ

      지금 제가 사용하는 곳에는 \n이 제대로 작동이 되는데 나중에 필요로 할 때가 있을테니 다시한번 머릿속에 입력을 해 두어야 겠습니다^^

댓글 쓰기