4

作为我作业的一部分,我正在尝试解决 Java 中的问题。问题如下:

用户根据屏幕提示,一个一个输入十个数字。然后屏幕将所有不同的值分配给一个数组和一个类似的数组,以保存这些数字出现多少次的频率。

我已经完成了以下工作,但似乎我在为数组分配频率和不同值时被困在某个地方:

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

1

数字是否仅限于 0-9?如果是这样,我会简单地完成任务。

(请注意,您会将输入分配给一个名为“输入”的变量):

数字[0]=输入;计数[输入]++;

您也可以在“0”中开始您的 for 循环,以避免在 for 循环之前进行分配。

只是一个提示。

希望这可以帮助!

于 2013-10-25T07:56:59.253 回答
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 回答
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,请告诉我,以便我可以使用数组创建一些东西。

让我知道它是否(不起作用)!
快乐的编码(祝你的任务好运);)-查理

于 2014-11-15T18:23:12.713 回答
0

理想的数据结构是 HashMap

步骤:1)初始化一个数组来存储数字和每个输入

2) 检查是否已存在以 key 作为输入数字的 hashmap 条目

3)如果存在简单地增加它的计数

4)否则创建新条目,键为数字并计为1

因此,如果您被迫使用 2 个数组,最后将计算您的频率

1)初始化两个数组

2)对于每个输入循环,数字数组并检查该数字是否已经在数组中

3)如果是这样,取数组索引并增加具有相同索引的频率数组的值

4) 如果不是 freq[index] = 1

于 2013-10-25T07:54:48.403 回答
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

这样做的正确方法是:

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 的一种方式,应尽可能避免使用它们。请参阅Effective Java,第 25 条:优先使用列表而不是数组

于 2013-10-25T08:06:30.630 回答