0

これは私が書かなければならないプログラムですが、このエラーが発生します。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
50

上位と下位のアルファベットをそれぞれ保持するために、upper と lower の 2 つの配列を使用して完全なプログラムを作成します。文字列の例を入力するようにユーザーに依頼します。

これは木星からのテストです。誰が木星出身かすぐにわかります!!! D博士かもしれません。

プログラムは文字列を解析し、アルファベットの数を追跡する必要があります。どちらの配列も 0 から 25 までのインデックスが付けられます。これを行う論理的な方法は、upper[0] を使用して「A」の数をカウントし、upper[1] を使用して「B」の数をカウントするなどです。同様に、下の配列の場合。

出力は次のようになります。

A: 0 a:2

B: 0 b:0
.
.
.
Z:0 z:0

コード

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class Letter {
  public static void main(String[] args) {

    // this is get results
    char[] chars = userEnters();

    System.out.println();
    System.out.println("Occurrences of each letter are:");
    PrintArray(countLow(chars), countUp(chars));
  }

  public static char[] userEnters() {

    String inputX = JOptionPane.showInputDialog("Enter line of text:  ");
    char[] chars = inputX.toCharArray();

    return chars;
  }

  public static int[] countLow(char[] input) {
    int[] counts = new int[26];

    for (int i = 0; i < input.length; i++) {
      counts[input[i] - 'a']++;
    }
    return counts;
  }

  public static int[] countUp(char[] input2) {
    int[] countsUp = new int[26];
    for (int i = 0; i < input2.length; i++) {
      countsUp[input2[i] - 'A']++;
    }
    return countsUp;
  }

  public static void PrintArray(int[] counts, int[] countsUp) {
    for (int i = 0; i < counts.length; i++) {

      System.out.print(counts[i] + " " + (char) ('a' + i) + " ");
      System.out.print(countsUp[i] + " " + (char) ('A' + i) + "\n");
    }
  }
}
4

4 に答える 4

7

大文字以外の文字を入力するcountUpと例外がスローされ、小文字以外の文字を入力するとcountLow例外がスローされます。

例: a を呼び出しcountLowた場合、どの戻りA値が計算され、負のインデックスは許可されません。'A' - 'a'-32

ロジックを見直して、文字の大文字と小文字に応じて countLow または countUp のいずれかを呼び出し、無効な文字を除外する必要があります。または、全体をリファクタリングしてchar[52]、たとえば、小さい大文字と大きい大文字の両方を保持する場所を使用します。

于 2013-07-11T13:46:00.357 に答える
1

コードを少しリファクタリングしたことを気にしないでください。

問題に対するこの代替ソリューションを見て、回答の下部にあるコメントを読んでください。

   import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JOptionPane;


public class LetterCounter {

    //Hash maps don't allow duplication. 
    //The letter will be the Key and the repetitions the value(Your goal!)
    private Map<Character, Integer> resultsMap = new HashMap<Character, Integer>(); 

    public static void main(String[] args) {

        LetterCounter letterCounter = new LetterCounter();
        letterCounter.fillMap();
        letterCounter.showMapContents();        
    }

    private void showMapContents() {
        for (Entry<Character, Integer> entry : resultsMap.entrySet())
        {
            System.out.println("'" + entry.getKey() + "' - " + entry.getValue() + " times");
        }       
    }

    private void fillMap() {
        char[] userInputAsArray = getUserInputAsLetterArray();
        for (int currentLetter = 0; currentLetter < userInputAsArray.length; currentLetter++) {
            int count = getOccurences(userInputAsArray[currentLetter],userInputAsArray);
            resultsMap.put(userInputAsArray[currentLetter], count);
        }
    }

    private int getOccurences(int letter, char[] userInputAsArray) {
        int counter = 0;
        for (int currentIndex = 0; currentIndex < userInputAsArray.length; currentIndex++) {
            if(userInputAsArray[currentIndex] == letter)
                counter++;
        }
        return counter;
    }

    public char[] getUserInputAsLetterArray() {
        String userInput = JOptionPane.showInputDialog("Enter line of text:  ");
        char[] chars = userInput.toCharArray();
        return chars;
    }
}
  • データを操作する必要がある演習を行う場合は常に、ジョブに最適なデータ構造を選択する必要があります。あなたの場合、重複を回避し、あなたのために仕事の大部分を行うので、ハッシュマップは興味深いかもしれないと思います. このリンクで非常に優れたチート シートを見つけてください: http://www.janeve.me/articles/which-java-collection-to-use
  • あなたは多くの静的を使用していることに気付きましたが、それはあまりオブジェクト指向のことではありません。別の方法として、このような簡単な例をすぐに実行したい場合は、クラスを内部で初期化するだけです。

これがお役に立てば幸いです。

于 2013-07-11T14:21:30.790 に答える