7

文字列があり、すべての文字と数字の出現をカウントし、グラフを作成して、出現をグラフィカルに確認したいと考えています。

たとえば、次のようになります。

String sentence = "ABC ABC ABC 123"

A (3) * * *
B (3) * * *
C (3) * * *
D
.
.

私の考え方:

  1. 文字列内のすべての数字と文字を数えます
  2. すべてのアスタリスクにこの数値を掛けて出力します (残念ながら、Java では String に int を掛けることはできません)。

文字数の数え方は2通りあると思います。charAt()メソッドを使用するかtoCharArray()、文字列または配列をループして文字を数えることができます。

例えば:

aCounter = 0;
bCounter = 0;
char ch = sentence.charAt(i);

for (i = 0; i < sentence.length(); ++i) {
    if (ch == 'a') {
        aCounter++;
    }
    if (ch == 'b') {
        bCounter++;
    }
}

ただし、このアプローチには複数の問題があります。

  • 多くのカウンタ変数を作成する必要があります-aCounterスルーzCounterプラス0counterスルー9counter
  • アスタリスクを出力するには、別の for ループを作成する必要があります。

ここで決まった答えを求めているわけではありません。行き詰まっているので、良い方向性を探しているだけです。

4

12 に答える 12

2

StringReaderここでは、Mapを使用する OOP アプローチを示します。以前TreeMap は出力をソートしていました。

public class StringHistogram
{
  public static void main(String[] args) throws IOException
  {
    Scanner sc = new Scanner(System.in);
    System.out.print("Please insert string: ");
    String s = sc.nextLine();
    sc.close();
    System.out.println(s);

    StringReader r = new StringReader(s);

    Map<Character, Integer> histogram = new TreeMap<Character, Integer>();
    int c;
    while ((c = r.read()) != -1) {
      Integer count = histogram.get((char) c);
      if (count == null)
        count = 0;
      histogram.put((char) c, count + 1);
    }
    r.close();
    for (Entry<Character, Integer> entry : histogram.entrySet())
      System.out.println(entry.getKey() + " (" + entry.getValue()
          + ") " + createAsterisk(entry.getValue()));
  }

  private static String createAsterisk(int number) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < number; i++)
      sb.append("*");
    return sb.toString();
  }
}
于 2013-09-12T15:03:05.243 に答える
1

あなたはこれに不慣れで、まだ解決策を持っていないので (誰もがそこから始めます)、正しい答えはクラスで学習しているデータ構造を使用することです。

マップを学習している場合

  • TreeMap はソートしますが、キーの自然な順序 (印刷に適しています)
  • HashMap にはあまり予測可能な順序がありません

配列を学習している場合は、このスレッドに既に素晴らしい例があります。クラッシュからの反応

于 2013-09-12T15:18:09.693 に答える
0

ここで、 OOP ではない最後のミニマルな回答です。効果的に3行で。文字は整数として解釈できるため、機能します。

スキャナーを閉じないのが少し気になりました。しかし、javadoc が言うのでSystem.in
is already open and ready to supply input data。リソースのクローズもシステムによって処理されると想定しています。

public class MinimalisticHistogram
{
  public static void main(String[] args)
  {
    int[] occurrences = new int[(int) Math.pow(2, 16)]; // 256 KB
    for (char c : new Scanner(System.in).nextLine().toCharArray()) occurrences[c]++;
    for (int i = 0; i < occurrences.length; i++) if (occurrences[i] != 0) System.out.println(String.format("%c %4s %s", i, "(" + occurrences[i] + ")", new String(new char[occurrences[i]]).replace('\0', '*')));
  }
}
于 2013-09-13T13:11:38.620 に答える
0

そこで、文字数をカウントするために double for ループを使用しました。配列の 1 つで文字が一致した場合、カウントは 3 番目の配列に追加されました。

for (int i = 0; i < zinArray.length; i++) {
    char c = zinArray[i];
    for (int j = 0; j < controleArray.length; j++) { 
        char d = controleArray[j];      
        if (c == d) {
        letterCount[j]++;
        break; 
        }
    }
}
于 2013-09-14T12:21:46.713 に答える