2

注: 採点用ではなく、単なる練習問題です。

これは、初年度の Java コースで与えられる練習問題です。

0 から 50 までの範囲内の任意の数の整数をユーザーが読み取り、それぞれの出現回数をカウントするアプリケーションを設計および実装します。すべての入力が処理された後、1 回以上入力されたすべての値を (出現回数とともに) 出力します。さらに、ユーザーが入力したすべての数値の出現回数の平均を計算する値を返さないメソッドを作成します。

これは私が持っているものです(これをクリーンアップするまで「平均的な発生」の部分をスキップしました):

import java.util.Scanner;
public class Main 
{       
public static Scanner scan = new Scanner(System.in);

    public static int[] userIntegers()      // this method will build the array of integers, stopping when an out-of-range input is given
    {
            System.out.println("Enter the number of integers to be recorded:  ");
            int numInts = scan.nextInt();

            int[] userArray = new int[numInts];
            int i = 0;
            while(i < numInts)
            {
                    System.out.println("Enter an integer between 1-50 inclusive:  ");
                    int userInteger = scan.nextInt();
                    if(isValidInteger(userInteger))
                    {
                            userArray[i] = userInteger;
                            i++;
                    }
                    else if(isValidInteger(userInteger) == false)
                    {
                            System.out.println("Try again.");
                    }                       
            }
            return userArray;
    }

    public static void occurrenceOutput(int[] input)         // this method will print the occurrence data for a given array
    {   
        int[] occurrenceArray = new int[51];

            int j = 0;
            while(j < 51)  // iterates through all integers from 0 to 50, while the integer in the array is equal to integer j, the corresponding occurance array element increments.
            {
                    for(int eachInteger : input)
                    {
                            occurrenceArray[j] = (eachInteger == j)? occurrenceArray[j]+=1:  occurrenceArray[j];
                    }
                    j++;
            }               

            int k = 0;
            for(int eachOccurrence : occurrenceArray) // as long as there is more than one occurrence, the information will be printed.
            {
                    if(eachOccurrence > 1)
                    {
                            System.out.println("The integer " + k + " occurrs " + eachOccurrence + " times.");
                    }
                    k++;
            }
    }

    public static boolean isValidInteger(int userInput)     // checks if a user input is between 0-50 inclusive        
    {        
        boolean validInt = (51 >= userInput && userInput >= 0)?  true:  false;
            return validInt;
    }

    public static void main(String[] args)
    {
        occurrenceOutput(userIntegers());
    }
}  

誰かが私をよりエレガントな方向に向けることができますか?

編集:助けてくれてありがとう!これが私が今いるところです:

import java.util.Scanner;
public class simpleHist
{
    public static void main(String[] args)
{
            getUserInputAndPrint();
            getIntFreqAndPrint(intArray, numberOfInts);
    }

    private static int numberOfInts;
    private static int[] intArray;
    private static int[] intFreqArray = new int[51];

    public static void getUserInputAndPrint() 
    {
            //  The user is prompted to choose the number of integers to enter:
            Scanner input = new Scanner(System.in);
            System.out.println("Enter the number of Integers:  ");
            numberOfInts = input.nextInt();

            //  The array is filled withchInteger = integer; integers ranging from 0-50:
            intArray = new int[numberOfInts];
            int integer = 0;
            int i = 0;
            while(i < intArray.length)
            {
                    System.out.println("Enter integer value(s):  ");
                    integer = input.nextInt();
                    if(integer > 50 || integer < 0)
                    {
                            System.out.println("Invalid input.  Integer(s) must be between 0-50 (inclusive).");
                    }
                    else
                    {
                            intArray[i] = integer;
                            i++;
                    }
            }

            // Here the number of integers, as well as all the integers entered are printed:
            System.out.println("Integers: " + numberOfInts);    
            int j = 0;
            for(int eachInteger : intArray)
            {
                    System.out.println("Index[" + j + "] : " + eachInteger);
                    j++;
            }
    }

public static void getIntFreqAndPrint(int[] intArray, int numberOfInts)
{
    //  Frequency of each integer is assigned to its corresponding index of intFreqArray:
    for(int eachInt : intArray)
    {
        intFreqArray[eachInt]++;
    }

    //  Average frequency is calculated:
    int totalOccurrences = 0;
    for(int eachFreq : intFreqArray)
    {
        totalOccurrences += eachFreq;
    }
    double averageFrequency = totalOccurrences / numberOfInts;

    //  Integers occurring more than once are printed:
    for(int k = 0; k < intFreqArray.length; k++)
    {
        if(intFreqArray[k] > 1)
        {
            System.out.println("Integer " + k + " occurs " + intFreqArray[k] + " times.");
        }
            }

            //  Average occurrence of integers entered is printed:
            System.out.println("The average occurrence for integers entered is " + averageFrequency);
            }
    }
4

2 に答える 2

2

あなたは実際にヒストグラムを探しています。を使用して実装できますMap<Integer,Integer>。または、要素の範囲が0〜50に制限されているため、51要素[0〜50]の配列を使用でき、histogram[i]を読み取ると増加しますi

ボーナス:このアイデアを理解し、カウントソートの基本を理解しました

于 2012-04-07T23:09:44.823 に答える
1

オカレンスを計算するには、次のようにします。

 for(int eachInteger : input) {
      occurrenceArray[eachInteger]++;
 }

これにより、whileループが置き換えられます。

于 2012-04-07T23:11:14.480 に答える