Нужно посчитать частоту # выходных данных двухмерного массива и назначить ее одномерному массиву - PullRequest
1 голос
/ 21 июня 2010

Необходимо поместить частоту каждого числа в массив 1D и вывести результат. Часть 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 ]

2 голосов
/ 21 июня 2010

Примерно так: я бы предположил:

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;
}

Это немного надуманный пример, так как обычно собираемые значения не попадают в индекс массива, поэтому хэш-карта будетболее типичное решение.

На самом деле было бы забавнее умножить 2 случайных числа (например, Math.random () * Math.random () + 1), чтобы заполнить матрицу, тогда вместо этого вы получите хорошую кривую колоколаскучного белого шума в вашем окончательном распределении частот.

0 голосов
/ 21 июня 2010

Если вы заранее знаете, что эти числа находятся в указанном диапазоне (т. Е. От 1 до 13, в соответствии с вашим кодом), вы можете принять простое решение, подобное решению Питера Тиллеманса.

Другим решением является использование 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...