Смотрение на частоту количества # 2D вывода массива и присваивает его 1D массив

Должен поместить частоту каждого возникновения числа в 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 (?);
1
задан S.Jaub 20 June 2010 в 21:39
поделиться

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

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

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

2
ответ дан 2 September 2019 в 23:38
поделиться

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

Другое решение - использовать карту для хранения частот чисел, содержащихся в матрице.

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

}

Используя этот тип данных, функция частота развивается в следующем коде. Я думаю, что с помощью этого небольшого переписывания вы сможете более эффективно выразить то, что делает ваш код.

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;
}
0
ответ дан 2 September 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: