需要将每个数字出现的频率放入一维数组并输出结果。 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 (?);
答案 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;
}