제가 필요해서 만들어 본 짤막한 자바 코드입니다.
지금 만들고 있는 게시판에 필요해서 짜 본 코드이거든요. 이 짤막한 코드가 하는 일은 아주 간단합니다. 파라미터로 문자열을 넣어주면 그 문자열이 몇 줄짜리인지를 알아내서 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()가 먼저 떠올라서 다른 방법을 생각할 수 없게 되었었습니다…ㅠㅠ
이게 코드도 짧고 훨씬 낫네요..ㅎㅎ
String 객체의 lastIndexOf 보단 charAt으로 char값을 비교해서 count하는게 더 보기 좋을듯하네요.
음 근데 Utility 객체가 저러다 수퍼클래스가 되지 않을까 걱정입니다~~
오오!! 감사합니다!!
머리가 나빠서 charAt()를 사용하는 방법을 미처 생각하지 못했었네요.
코드가 훨씬 간단하고 보기좋고 더불어 효율적으로 바뀌었습니다^^ㅋ
그런데 Utility객체가 수퍼클래스가 된다는게 무슨 말씀인지 잘 모르겠습니다…;;;
음, 조금 특이한 방법으로 만들어 봤어요
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人, 이 댓글은.. 조크입니다)
시스템에 따라서는 줄바꿈에 \n을 사용하지 않는 경우도 있습니다^^
\n는 LineFeed문자이구요.. \r이라는 CarriageReturn 문자도 있죠.. 도스, 윈도우계열은 통상 \r\n을 줄 끝에 넣구요.. 유닉스 계열은 통상 \n을 넣습니다.
하지만 정확히 기억안나는 모종의 시스템은 \r만을 씁니다. ^^
예전에 소켓통신 관련 부분을 공부할 때 rn과 n 등을 써먹었던게 기억이 납니다. r만 사용하는 시스템도 있었군요^^ㅋ
루미넌스님의 댓글엔 항상 정보가 담겨있는 것 같아요^^ㅋ
지금 제가 사용하는 곳에는 n이 제대로 작동이 되는데 나중에 필요로 할 때가 있을테니 다시한번 머릿속에 입력을 해 두어야 겠습니다^^