期望计算2D阵列输出的#的频率并将其分配给1D阵列

时间:2010-06-20 21:39:22

标签: java arrays 2d

需要将每个数字出现的频率放入一维数组并输出结果。 2D到1D的部分让我失望,我对数组还不是很熟悉。

public static void main( String[] args ){

  int matrix [][]=new int[20][2];

  for (int row=0;row<matrix.length;row++){
    for (int column=0;column<matrix[row].length;column++)
      matrix[row][column]=(int)(Math.random()*12+1);

  }
   frequency(matrix);




public static int frequency(int [][] matrix){
   int [] nums =[12];
   int count =0;
   for (int i=0;i<matrix.length;i++){
      for (int j=0; j<matrix[i].length;j++)
            (???)

       }
   return (?);

2 个答案:

答案 0 :(得分:2)

我想是这样的事情:

public static int[] frequency(int [][] matrix){
    int [] nums =[14];      // max value can be 13 so you need 14 element
    int count =0;
    for (int i=0;i<matrix.length;i++){
        for (int j=0; j<matrix[i].length;j++) {
            nums[matrix[i][j]] += 1;
        }
    }
    return nums;
}

这是一个人为的例子,因为通常要收集的值不会很好地落在数组索引上,所以hashmap将是一个更典型的解决方案。

实际上,将2个随机数(如Math.random()* Math.random()+ 1)相乘以填充矩阵会更有趣,然后你得到一个漂亮的钟形曲线,而不是在你的最后一个无聊的白噪声频率分布。

答案 1 :(得分:0)

如果您事先知道这些数字在指定范围内(即根据您的代码从1到13),您可以采用像Peter Tillemans那样的简单解决方案。

另一种解决方案是使用Map来存储矩阵中包含的数字的频率。

public static Map<Integer, Integer> frequency(int[][] matrix) {
    Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();

    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            Integer frequency = 0;

            if (frequencies.containsKey(matrix[i][j])) {
                frequency = frequencies.get(matrix[i][j]);
            }

            frequencies.put(matrix[i][j], frequency + 1);
        }
    }

    return frequencies;
}

如果将Map接口暴露给外部代码不是您想要的,您还可以编写自定义数据类型来保存结果。通过这种方式,您可以隐藏结果的实现(数组,映射或其他任何内容),并仅提供您真正需要的方法。

public class FrequencyResults {

    private Map<Integer, Integer> frequencies;

    public FrequencyResults() {
        frequencies = new HashMap<Integer, Integer>();
    }

    public void increment(int number) {
        Integer frequency = 0;

        if (frequencies.containsKey(number)) {
            frequency = frequencies.get(number);
        }

        frequencies.put(number, frequency + 1);
    }

    public int get(int number) {
        Integer frequency = 0;

        if (frequencies.containsKey(number)) {
            frequency = frequencies.get(number);
        }

        return frequency;
    }

}

使用此数据类型,frequency函数在以下代码中演变。我认为,通过这种小的重写,您可以更有效地表达您的代码所做的事情。

public static FrequencyResults frequency(int[][] matrix) {
    FrequencyResults results = new FrequencyResults();

    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            results.increment(matrix[i][j]);
        }
    }

    return results;
}