我认为这一次应该与整个代码一起发布。
当我尝试将Scanner中的值获取到名为“分数”的数组中时,
第二个for陈述显示出意外的结果。
import java.util.Scanner;
public class B1546 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int[] score = new int[N];
Max scoreMax = new Max();
double sum = 0;
for (int i=0; i<N; i++) {
score[i] = input.nextInt();
}
for (int i=0; i<N; i++) {
System.out.println(score[i]); // this show the problems
sum = sum + ((double) score[i] / scoreMax.max(score) * 100);
}
System.out.println(sum / N);
}
}
class Max {
int max (int[] score) {
int[] tmpArray;
tmpArray = score;
for( int i=0; i<score.length-1; i++) {
for( int j=i+1; j<score.length; j++) {
if (tmpArray[i]<tmpArray[j]) {
int tmp = tmpArray[i];
tmpArray[i] = tmpArray[j];
tmpArray[j] = tmp;
}
}
}
return tmpArray[0];
}
}
例如,当我键入 3 10 20 30 然后它来了 10 20 10 ...
不是 10 20 30 ...
我不知道是什么问题。
答案 0 :(得分:2)
您的Max.max方法更改了数组-以int tmp =
开头的3行。
可能您的问题的根源是不了解引用类型。 tmpArray = score
不会复制数组score
的单独副本-您只有两个引用相同的数组。这个概念是Java编程的基础。
答案 1 :(得分:0)
int max (int[] score) {
int[] tmpArray;
tmpArray = score;
}
score
是对数组对象的引用。在这里,您可以创建一个对现有数组的新引用。要解决此问题,请制作一个新的数组对象:
int max(int[] score) {
int[] tmpArray = Arrays.copyOf(score, score.length);
}
答案 2 :(得分:0)
int[]
是对象,因此在Java中通过引用传递。当您在Max#max(int[])
方法中执行以下操作时:
int[] tmpArray;
tmpArray = score;
tmpArray
和score
都将具有相同的引用,因此当您交换tmpArray
中的值时,score
数组也将被修改。
您将不得不为tmpArray
创建一个新的整数数组,然后复制值。最简单的是以下两个之一:
int[] tmpArray = score.clone();
// or:
int[] tmpArray = Arrays.copyOf(score, score.length);