2016-09-07 2 views
1

文字列中のアルファベットの各文字がどれくらいの頻度で使用されているかを示すヒストグラムを出力する、toStringメソッドを作成しようとしています。最も頻繁に登場するキャラクターは60秒の長さでなければならず、残りのキャラクターはそれに合わせてスケーリングされます。が正しくないnum histgram

私の問題は、残りの文字をヒストグラムの正しい長さに合わせる式を作ることです。私の現在の方程式は(myArray [i]/max)* 60ですが、本当に奇妙な結果を得ています。

「hello world」を分析すると、Lが最も一般的な発生文字で、3回見られます。だから、ヒストグラムには60#、hは20、oは40などが必要です。代わりに、dのような結果が得られます:10 e:10 h:10 l:360 o:20 r:10 W:10、これはイムは、ちょうどあなたのコードを持つ多くの多くの問題があります

public class LetterCounter 

    private static int[] alphabetArray; 
    private static String input; 

    /** 
    * Constructor for objects of class LetterCounter 
    */ 
    public LetterCounter() 
    { 
     alphabetArray = new int[26]; 
    } 

    public void countLetters(String input) { 
     this.input = input; 
     this.input.toLowerCase(); 
     //String s= input; 
     //s.toLowerCase(); 
     for (int i = 0; i < input.length(); i++) { 
      char ch= input.charAt(i); 
      if (ch >= 97 && ch <= 122){ 
       alphabetArray[ch-'a']++; 
      } 
     } 

    } 

    public void getTotalCount() { 
     for (int i = 0; i < alphabetArray.length; i++) { 
      if(alphabetArray[i]>=0){ 
       char ch = (char) (i+97); 
       System.out.println(ch +" : "+alphabetArray[i]); 
      }   
     } 
    } 

    public void reset() { 
     for (int i =0; i<alphabetArray.length; i++) { 
      if(alphabetArray[i]>=0){ 
       alphabetArray[i]=0; 
       char ch = (char) (i+97); 
       System.out.println(ch +" : "+alphabetArray[i]); 
      }  
     } 
    } 

    public String toString() { 

     String s = ""; 
     int max = alphabetArray[0]; 
     int markCounter = 0; 

     for(int i =0; i<alphabetArray.length; i++) { 
      //finds the largest number of occurences for any letter in the string 
      if(alphabetArray[i] > max) { 
       max = alphabetArray[i]; 
      } 
     } 

     for(int i =0; i<alphabetArray.length; i++) { 
      //trying to scale the rest of the characters down here 
      if(alphabetArray[i] > 0) { 
       markCounter = (alphabetArray[i]/max) * 60; 
       char ch = (char) (i+97); 
       System.out.println(ch +" : "+alphabetArray[i] + markCounter); 
      } 
     } 

     for (int i = 0; i < alphabetArray.length; i++) { 
      //prints the whole alphabet, total number of occurences for all chars 
      if(alphabetArray[i]>=0){ 
       char ch = (char) (i+97); 
       System.out.println(ch +" : "+alphabetArray[i]); 
      } 
     } 
     return s; 
    } 
} 

答えて

0

に行くいただきまし把握しようとしているが、一つ一つを行くことができます、今どのようにずさんなため

申し訳ありません。

まず、の印刷の文は、単に誤解を招くだけです。

System.out.println(ch +" : "+alphabetArray[i] + " " + markCounter); 

にそれを変更し、あなたが見ることができるように、あなたは

d : 1 0 
e : 1 0 
h : 1 0 
l : 3 60 
o : 2 0 
r : 1 0 
w : 1 0 

が表示されます。カウンタが(1,1,1,3,2,1,1)正しいです。しかし、あなたのスケーリングは動作しません:

1/3 --> 0 ... and 0 * 3 ... is still 0 
3/3 --> 1  and 1 * 3 ... is 60 

もちろん、あなただけに変更して、正しいスケーリングを得るためにこのように1と0と3と60

の間にスペースを印刷いけないとき:

言及する価値
markCounter = alphabetArray[i] * 60/max; 

他のもの:

  1. あなたはをオーバーライドしますtoString()。次に、そのメソッドの前に@Overrideを入れてください。
  2. toLowerCase()は小文字の新しい文字列を返します。結果をあなたのストリングに戻さずに呼び出すだけです...「下部ケーシング」を放すだけです。
  3. toString()はコンソールに出力しないでください。全体のアイデアは、あなたが返す文字列にのすべての情報を入れることです。言い換えれば、最後にあなたは何かをするSystem.out.println(someLetterCounter.toString()
  4. あなたのコードは非常に低レベルです。 for(int)を使用して配列を反復処理するのではなく、代わりに(int letter:alphabetArray)を実行することができます
  5. Mapについてお読みください。マップキーが異なる文字を表すMap<Character, Integer>を使用していて、マップ値が各文字のカウンタを表していれば、あなたのコードのほとんどを捨てることができます。数行のコードしか必要としないソリューションを考え出してください。

は:

0

countLettersはそう(と真剣にすべてのこれらの問題を、あなたのコードをデバッグすると、ために必要なよりも、本当にはるかに困難であったため)いくつかの問題があります。あなたはStringはJavaで不変であるのでちょうど

this.input.toLowerCase(); 

を呼び出すことによって、小文字にStringを変換することはできません。

this.input = input.toLowerCase(); 

もう一つの問題は、あなたの代わりに小文字の文字列を持っているthis.inputのパラメータからinput変数を使用しています:あなたは次のようにそれを割り当てる必要があります。あなたはこの方法で作業を行うことができますcountLettersメソッド:

public void countLetters(String input) { 
    this.input = input.toLowerCase(); 
    for (int i = 0; i < this.input.length(); i++) { 
     char ch= this.input.charAt(i); 
     if (ch >= 97 && ch <= 122) { 
      alphabetArray[ch-'a']++; 
     } 
    } 
} 
関連する問題