Если вы заранее знаете, что эти числа находятся в указанном диапазоне (т. Е. От 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;
}