2011-11-21 6 views
-3
private static StringBuffer sb; 

public static void main(String[] args) { 
    // Text in a string 
    String text = "This is a poor sentence in grammar."; 

    String[] words = text.split("[ .!?]"); 
    for (int i = 0; i < words.length; i++) { 
     int counter = 0; 
     if (words[i].length() >= 1) { 
      for (int k = 0; k < words[i].length(); k++) { 
       if (Character.isLetter(words[i].charAt(k))) 
        counter++; 
      } 
      sb = new StringBuffer(); 
      sb.append(counter).append(" "); 
     } 
    } 
    System.out.println(sb); 
} 

이 코드를 더 최적화 할 수 있습니까? 내 Ouptut은 다음과 같습니다 -단어의 문자 수를 반환합니다.

4 2 1 4 8 2 7 

답변

1

예를 최적화 할 수있는 방법이있다 더. 구두점으로 만 문자열을 분할하는 대신 편지가 아닌 다른 곳으로 나누어야합니다. 그런 다음 length 함수를 사용하여 단어의 길이를 찾을 수 있습니다.

public static void main(String[] args) { 
String text = "This is a poor sentence in grammar."; 

String[] words = text.split("[^a-zA-Z]+"); 
for(int i=0;i<words.length;i++) 
    if(words[i].length()>0) 
     System.out.print(words[i].length()+" "); 
} 
+0

좋고 짧습니다. '+'를 추가하면 여러 개의 공백이나 ","분리 단어 같은 것을 먹게됩니다. 예 : "[^ a-zA-Z] +". – phatfingers

+0

예, 사실입니다. 나는이 글을 반영하기 위해 글을 편집 할 것입니다. 더하기 @phatfingers – Boundless

3

당신은 새로운 StringBuffer를 만드는 대신 원래 하나를 사용하여 유지.

main 메서드로 StringBuffer 선언을 옮기고 (선언문을 외부에 두지 않아도 됨) 선언문에 StringBuffer을 하나만 만듭니다. 항상 동일한 번호를 사용하도록 끝 부분의 new StringBuffer()을 제거하십시오.

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(); 
    String text = "This is a poor sentence in grammar."; 

    String[] words = text.split("[ .!?]"); 
    for (String word : words) { 
     int counter = 0; 
     for (int i = 0; i < word.length(); i++) { 
      if (Character.isLetter(word.charAt(i))) { 
       counter++; 
      } 
     } 

     if (counter > 0) { 
      sb.append(counter).append(" "); 
     } 
    } 

    System.out.println(sb); 
} 
나는이에 메인 라인 코드를 돌려뿐만 아니라 가독성을 최적화하고, 자신의 방법으로 문자 카운팅 코드를 리팩토링 것

:

String[] words = text.split("[ .!?]"); 
for (String word : words) { 
    int counter = countLetters(word); 
    if (counter > 0) { 
     sb.append(counter).append(" "); 
    } 
} 
+0

이 질문을 게시 한 후 의견을 주셔서 감사합니다. 저는 StringBuffer 문제를 해결했습니다. 그리고이 코드를 더 최적화 할 수있는 방법이 있습니까? – ferhan

+2

코드를 최적화하는 다른 방법에 대해 : Java 1.5 이상에서는 StringBuffer 대신 StringBuilder를 사용하십시오. 다중 스레드 액세스가 가능하지 않고 StringBuffer의 동기화가 필요하지 않기 때문입니다. 루틴이 여러 번 호출된다고 가정 할 때 "[.!]"를 패턴 (재사용 가능한 정규 표현식)으로 사전 컴파일하십시오. – ziesemer

+0

@ziesemer 네, 좋은 지적입니다. –

0

당신이 찾는 경우는, 당신의 가장 좋은 방법은 정기적를 사용하지 않는 것입니다 얼마나 빨리 당신의 코드가 실행 (유지 보수 비용 또는 코드 라인의 측면에서 최적화 된 동일시하지 않을 수 있음)에 따라 최적화 할 수 이 간단한 작업에 대한 표현. 예를 들어 아래의 코드는 무한한 예제 인 @ 무한히 제시된 것보다 수십 배 또는 수백 배 빠르게 실행됩니다. 장기적으로, 나는 그의 예를 오히려 유지하려고한다. 그러나 아주 많이 사용 된 코드를 최적화 할 실질적인 이유가 있다면 주목할 가치가있다.

StringBuilder sb=new StringBuilder(); 
char text[] = "This is a poor sentence in grammar.".toCharArray(); 
int word=0; 
for (int i=0; i<text.length; i++) { 
    char c=text[i]; 
    if (c>='A' && c<='z' && (c<='Z' || c>='a')) { 
     word++; 
    } else if (word>0) { 
     sb.append(word); 
     sb.append(' '); 
     word=0; 
    } 
} 
// Chop off trailing space 
sb.setLength(Math.max(0, sb.length()-1)); 
+0

char 비교의 이상한 배열은 구두점을 빠르게 실패하게하는 시도입니다. 구두점은 일반적으로 ASCII 차트의 'A'보다 먼저 나옵니다. – phatfingers

관련 문제