콘텐츠로 건너뛰기

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

숫자 세기
숫자 세기

제가 필요해서 만들어 본 짤막한 자바 코드입니다.

지금 만들고 있는 게시판에 필요해서 짜 본 코드이거든요. 이 짤막한 코드가 하는 일은 아주 간단합니다. 파라미터로 문자열을 넣어주면 그 문자열이 몇 줄짜리인지를 알아내서 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문이 무한루프에 빠지게 됩니다.

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


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()가 먼저 떠올라서 다른 방법을 생각할 수 없게 되었었습니다…ㅠㅠ

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


8 개의 댓글

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

    1. 오오!! 감사합니다!!

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

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

  2. 음, 조금 특이한 방법으로 만들어 봤어요
    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번째로 만든 코드가 더 낳아보이네요 ㅎㅎ

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

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

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

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

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

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다