在for语句中更改数组

时间:2019-01-28 14:49:56

标签: java

我认为这一次应该与整个代码一起发布。

当我尝试将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     ...

我不知道是什么问题。

3 个答案:

答案 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;

tmpArrayscore都将具有相同的引用,因此当您交换tmpArray中的值时,score数组也将被修改。

您将不得不为tmpArray创建一个新的整数数组,然后复制值。最简单的是以下两个之一:

int[] tmpArray = score.clone();

// or:

int[] tmpArray = Arrays.copyOf(score, score.length);

我建议第二个.clone() is normally used for other purposes

Try it online.