如何在Java中正确更改数组元素的值?

时间:2013-10-27 10:27:14

标签: java arrays

这可能算是非常简单的事情,但由于我只有大约5周的时间进入Comp Sci课程,请原谅我的任何无知。

作为我们今年成绩的一部分,我们必须实施'Spread-and-Die'游戏。此游戏的界面是命令行中的12 x 12 ASCII布局。

我为解决问题所做的代码,而不是我的实际代码,由于长度荒谬,我在这里:

class PrintTest
{
    public static void main (String[] args)
    {
        final char[] array = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'};


        char[] array1 = array;
        char[] array2 = array;
        char[] array3 = array;

        array2[6] = 'P';

        System.out.println("\n");

        System.out.print (array1[0]);
        System.out.print (array1[1]);
        System.out.print (array1[2]);
        System.out.print (array1[3]);
        System.out.print (array1[4]);
        System.out.print (array1[5]);
        System.out.print (array1[6]);
        System.out.print (array1[7]);
        System.out.print (array1[8]);
        System.out.print (array1[9]);
        System.out.print (array1[10]);
        System.out.print (array1[11]);

        System.out.print("\n");

        System.out.print (array2[0]);
        System.out.print (array2[1]);
        System.out.print (array2[2]);
        System.out.print (array2[3]);
        System.out.print (array2[4]);
        System.out.print (array2[5]);
        System.out.print (array2[6]);
        System.out.print (array2[7]);
        System.out.print (array2[8]);
        System.out.print (array2[9]);
        System.out.print (array2[10]);
        System.out.print (array2[11]);

        System.out.print("\n");

        System.out.print (array3[0]);
        System.out.print (array3[1]);
        System.out.print (array3[2]);
        System.out.print (array3[3]);
        System.out.print (array3[4]);
        System.out.print (array3[5]);
        System.out.print (array3[6]);
        System.out.print (array3[7]);
        System.out.print (array3[8]);
        System.out.print (array3[9]);
        System.out.print (array3[10]);
        System.out.print (array3[11]);

        System.out.print("\n");
    }
}   

我也很明显地看到,无法找到如何打印整个数组,因此,鉴于我的解决方案的丑陋,任何提示都会有用。

无论如何,当代码被编译/运行时,我得到了这个:

######P#####
######P#####
######P#####

鉴于我对Java和编程的一般认识有限,只有第二行应该有一个'P'。由于某种原因,array2的语句更改元素6也对其他两个数组执行相同的操作。

非常感谢帮助。

3 个答案:

答案 0 :(得分:2)

因为原始数组就像对象,所以它们包含引用。因此,在分配array2[6] = 'P'时,就像说array[6] = 'P',因此array1[6] = 'P'array3[6] = 'P'

为避免这种情况,您可以在创建阵列时调用方法clone()

char[] array1 = array.clone();
char[] array2 = array.clone();
char[] array3 = array.clone();

如果要为阵列复制指定元素,可以使用Arrays.copyOfRange

char[] array1 = Arrays.copyOfRange(array, 0, array.length);
                                     ^    ^       ^
                                     |    |       |

                                     |    |    indice to

                                     | indice from

                                     |
                            array to be copied

同样要打印数组,可以使用for循环。

for(int i = 0; i < array1.length; i++)
     System.out.print(array1[i]);

System.out.println();

答案 1 :(得分:1)

由于您的所有数组都指向相同的引用,因此您将获得相同的值

你可以创建一个打印数组的函数,以避免冗余代码

class PrintTest
{
    public static void main (String[] args)
    {
        final char[] array = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'};
        char[] array1 = array;
        char[] array2 = array;
        char[] array3 = array;
        array2[6] = 'P';
        printArr(array1);
        printArr(array2);
        printArr(array3);

    }

    public static void printArr(char[] array){
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]);         
        }
        System.out.println();
    }
}   

不是分配数组引用,而是尝试按照其他答案的建议创建新数组

答案 2 :(得分:0)

这是因为你只创建了一个数组,并从3个变量引用了完全相同的数组。

您需要创建3个独立的数组,如下所示:

char[] array1 = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'};
char[] array2 = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'};
char[] array3 = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'};