Java 查找二维阵列的模式
我尝试使用频率数组返回2D数组的模式。我有一个数组score,长度为10,有3列。每列包含一个介于0和100之间的int 我试图找到一种方法,通过数组迭代并返回模态值。到目前为止,我得到的是:Java 查找二维阵列的模式,java,arrays,Java,Arrays,我尝试使用频率数组返回2D数组的模式。我有一个数组score,长度为10,有3列。每列包含一个介于0和100之间的int 我试图找到一种方法,通过数组迭代并返回模态值。到目前为止,我得到的是: int value = 0; int[] freq = new int[100]; for (int row = 0; row < score.length; row++) { for (int col = 0; col < score[row].le
int value = 0;
int[] freq = new int[100];
for (int row = 0; row < score.length; row++) {
for (int col = 0; col < score[row].length; col++) {
score[row][col] = value;
freq[value]++;
}
}
int largest = 0;
int mode = -1;
for (int i = 0; i < 100; i++) {
if (freq[i] > largest)
{
largest = freq[i];
mode = i;
}
}
System.out.println("modal score is: " +mode);
int值=0;
int[]freq=新的int[100];
for(int row=0;row最大值)
{
最大=频率[i];
模式=i;
}
}
System.out.println(“模式分数为:“+模式”);
问题是,这只是将模态分数返回为0,而实际情况并非如此。您在生成
freq
数组时遇到问题。如果我理解正确,在第一个double for块中,您试图将数字的频率放入freq
数组中
但你所做的只是:
int value = 0;
.....
score[row][col] = value;
freq[value]++;`
首先,您要更改分数数组(我想这对您来说是个问题…),然后进入freq[0]
并执行++
。显然,modal是0,该数字出现在所有数组中
解决方案:在第一个double for block中,您应该执行以下操作:
value = score[row][col];
freq[value]++;
因此,我认为您混淆了行的顺序,应该是相反的;
int value = 0;
int [] freq = new int [arr.length];
for (int i = 0; i < arr.length; i++){
for (int j = 0; j < arr[i].length; j++){
value = arr[i][j];
freq[value]++;
}
}
int largest = 0;
int mode = 0;
for (int i = 0; i < freq.length; i++) {
if (freq[i] > largest)
{
largest = freq[i];
mode = i;
}
}
System.out.println("modal score is: " +mode);
int[]freq=新int[arr.length];
对于(int i=0;i最大值)
{
最大=频率[i];
模式=i;
}
}
System.out.println(“模式分数为:“+模式”);
专用静态无效打印模式(双[]双[]双){
HashMap=newHashMap();
对于(int i=0;ival.getValue().equals(objects[objects.length-1]);
stream.forEach(System.out::println);
}
我认为使用流查找模式是最好的方法。
使用int而不是double不会导致任何问题。您总是将
分数[row][col]
分配给值
,但是值实际上是零,因为初始化后它不会更改。为什么有这行代码<代码>分数[行][列]=值代码>score[row][col]=value
不应该反过来吗?
private static void printMode(double[][] doubles) {
HashMap<Double , Double> map = new HashMap();
for (int i = 0; i < doubles.length; i++) {
for (int j = 0; j < doubles[i].length; j++) {
double temp = doubles[i][j];
if(map.get(temp)==null){
map.put(doubles[i][j],1.0);
}else {
double temp2 = (double) map.get(temp);
map.put(doubles[i][j],++temp2);
}
}
}
Object[] objects = map.values().stream().sorted().toArray();
Stream stream = map.entrySet().stream().filter(val-> val.getValue().equals(objects[objects.length-1]));
stream.forEach(System.out::println);
}