4

課題の一環として Java の問題を解決しようとしています。問題は以下のとおりです。

ユーザーは、画面のプロンプトに従って 10 個の数字を 1 つずつ入力します。次に、画面はすべての個別の値を配列と同様の配列に割り当てて、それらの数値が出現した回数の頻度を保持します。

私は以下の作業を行いましたが、周波数と個別の値を配列に割り当てる際にどこかで立ち往生しているようです:

import java.util.*;

public class JavaApplication10 
{
    public static void main(String[] args)
    {
       int [] numbers = new int [10];
       int [] count = new int[10];
       int [] distinct = new int[10];

       for (int k=0;k<10;k++)
       {
           count[k]=0;
           distinct[k]=0;
       }
       java.util.Scanner input = new java.util.Scanner(System.in);

       System.out.print("Enter number 0: ");
       numbers[0]=input.nextInt();
       count[0]=1;
       distinct[0]=numbers[0];
       int j=0;
       for (int i = 1;i<10;i++)
       {
           System.out.print("Enter number "+i+": ");
           numbers[i]=input.nextInt();

           while(j<i)
           {
               if (distinct[j]==numbers[i])
               count[j]=count[j]+1;
               else
                   distinct[j+1]=numbers[i];
               j++;
           }
       }
    for (int k=0;k<10;k++)
    {
        System.out.println(distinct[k]+ " "+count[k]);
    }


       }
   }

問題を解決するために誰かに助けを求めるのは公平ではないことを私は知っています。しかし、どんな種類のヒントも役に立ちます。ありがとうございました

4

6 に答える 6

0

これはあなたが必要としているものだと思います。間違っていたら訂正してください...

import java.util.HashMap;
import java.util.Scanner;

public class JavaApplication10 {
public static void main(String[] args) {
    // Initializing variables
    int[] numbers                       = new int[10];
    HashMap<Integer, Integer> table     = new HashMap<Integer, Integer>();
    Scanner input                       = new Scanner(System.in);

    // Getting the 10 inputs
    for(int x=0; x<10; x++) {

        // Asking for input
        System.out.println("Enter number "+x+":");
        numbers[x]=input.nextInt();

        // If the table contains the number, add 1
        // Otherwise: set value to 1
        if(table.containsKey(numbers[x]))
            table.put(numbers[x], table.get(numbers[x])+1);
        else
            table.put(numbers[x],1);

    }
    // Closing the reader
    input.close();      

    // Get the highest and smallest number
    int highest=0;
    int smallest=0;
    for(int i:table.keySet()) {
        if(i>highest)
            highest=i;
        if(i<smallest)
            smallest=i;
    }



    // For every value between the smallest and the highest
    for (int x=smallest; x<=highest; x++) {
        // Check if the frequency > 0, else continue
        if(table.get(x)==null)
            continue;
        // Output
        System.out.println(x+" is "+table.get(x)+" times in \'frequence\'");
    }

}
}

これは、他のコードとは異なり、負の数でも処理します。HashMaps を使用したくない場合はお知らせください。配列を使用して何かを作成できます。

うまくいくかどうか教えてください!
幸せなコーディング (そして、あなたの割り当てを頑張ってください) ;) -Charlie

于 2014-11-15T18:23:12.713 に答える
0

それを行う適切な方法は次のとおりです。

public Map<Integer, Integer> getFrequencies(Iterable<Integer> numbers) {
    Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();
    for(Integer number : numbers) {
        if (frequencies.get(number) == null) {
            frequencies.put(number, 0);
        }
        frequencies.put(number, frequencies.get(number) + 1);
    }
    return frequencies;
}

マップを返しますnumber -> frequency

配列はJava で使用する方法ではありません。可能な限り避ける必要があります。有効な Java の項目 25: 配列よりもリストを優先する を参照してください。

于 2013-10-25T08:06:30.630 に答える
0

絶対に配列を使用する必要がある場合..これを行う方法は次のとおりです...

import java.util.Scanner;
import java.util.Arrays;

public class JavaApplication10 
{
  public static void main(String[] args)
  {
   int [] numbers = new int [10];
   int [] count = new int[10];
   int [] distinct = new int[10];
   int [] distinct1 = new int[1];
   int distinctCount = 0;
   boolean found = false;

   Scanner input = new Scanner(System.in);

   for (int i=0; i<10; i++) {
   found = false;
   System.out.print("Enter number " + i);
   numbers[i]=input.nextInt(); //Add input to numbers array

   for (int j=0; j<=distinctCount; j++)
   {
     if (distinct1[j] == numbers[i]){ // check to see if the number is already in the distinct array

           count[j] = count[j] + 1; // Increase count by 1
           found = true; 
           break;
     }
   }

   if (!found) {
       distinct[distinctCount] = numbers[i];
       count[distinctCount] = 1;
       distinctCount++;
       distinct1 = Arrays.copyOf(distinct, distinctCount+1);
   }

   }
   for (int j=0; j<distinctCount; j++) 
     System.out.println("The number " + distinct1[j] + " occurs " + count[j] + " times" );


}

}

于 2013-10-25T09:00:40.670 に答える
0

理想的なデータ構造は HashMap です

手順: 1) 配列を初期化して数値を格納し、入力ごとに

2) 入力された数値をキーとするハッシュマップ エントリが既に存在するかどうかを確認します

3) 存在する場合は、単純にカウントを増やします

4) それ以外の場合、キーを数値として新しいエントリを作成し、1 としてカウントします

したがって、2つの配列を使用する必要がある場合、最後に周波数が計算されます

1) 2 つの配列を初期化する

2) 入力ループごとに数値配列を調べ、その数値が既に配列内にあるかどうかを確認します。

3) その場合、配列インデックスを取得し、同じインデックスで頻度配列の値をインクリメントします。

4) freq[index] = 1 でない場合

于 2013-10-25T07:54:48.403 に答える
0

コードをより速く書くために Scanner オブジェクトを削除しました。それを上記のコードに置き換えるだけで動作するはずです。

    int[] numbers = { 1, 2, 2, 2, 3, 3, 3, 1, 1, 2 };
    int[] count = new int[10];
    int[] distinct = new int[10];

    count[0] = 1;
    distinct[0] = numbers[0];
    int disPos = 1; //Current possition in the distinct array
    boolean valueInarray = false;
    for (int i = 1; i < 10; i++) {
        valueInarray = false;
        for (int d = 0; d < i; d++) {

            if (numbers[i] == distinct[d]) {
                count[d] = count[d] + 1;
                valueInarray = true;
                break;
            }

        }
        if (!valueInarray) {
            distinct[disPos] = numbers[i];

            count[disPos] = 1;
            disPos++;
        }

    }
于 2013-10-25T08:32:16.703 に答える