【问题标题】:java method is returning correctly but also changing the initial argument [duplicate]java方法正确返回但也改变了初始参数[重复]
【发布时间】:2018-03-03 20:41:01
【问题描述】:

这是为了第十五场比赛,我做了一个类(Config),它由一个整数数组组成,代表棋盘的状态。 然后我做了一些接收配置A的移动方法,创建它的副本,找到它的0并应用该方法应该进行的任何移动,然后将其作为配置B返回。 这是按计划发生的,但问题是当我尝试打印配置 A 之后它也发生了变化,并且无论我做什么动作都与 B 相同。 示例:https://imgur.com/qnZX12Ydada.tabela 是数组

如果我在 move_left_new 之前打印 randomconfig,它会按原样打印原始配置,但是如果我之后打印它,它将与 testingmove 一样打印。

import java.util.*;
class Config{
int[] tabela;


Config(){
int[] blanks ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
tabela = blanks;
}
public Config(int arraydado[]){
tabela = arraydado;}
 public void printTabela(){
for(int i = 0; i<16 ;i++)
    System.out.print(tabela[i] + " ");
System.out.println();
}
}
    public static Config move_left_new(Config dada){
    int i;
    int temp;
    Config resultante = new Config(dada.tabela);
    for(i = 0; i<16; i++){
    if(resultante.tabela[i] == 0)
        break;
    }
    if( i!=0 && i!= 4 && i!= 8 && i!=12){
    temp = resultante.tabela[i-1];
    resultante.tabela[i-1] = 0;
    resultante.tabela[i] = temp;
    }
    return resultante;
}

public static void main(String[] args){
Scanner input = new Scanner(System.in);
int arr[] = new int[16];
for(int i=0; i<16; i++)
arr[i] = input.nextInt();

Config randomconfig = new Config(arr);
randomconfig.printTabela(); //original
Config changed = move_left_new(randomconfig);
randomconfig.printTabela(); //should be the same as before but isnt
changed.printTabela(); // moved as it should
}

【问题讨论】:

  • 将所有代码直接作为文本发布在这里。为什么要将文本作为图像发布?
  • 还有很多与此无关的内容,但我将这里的主要部分粘贴为文本
  • 请在创建 ConfigA 的副本时添加代码
  • @Rodrigo 我真的很喜欢看非英语的代码。这让我想起了挪威的公共部门。顺便说一句,-1 不是我 :)
  • @Rodrigo 这就是为什么您发布的代码应该是您的问题的minimal reproducible example

标签: java methods


【解决方案1】:

数组是java中的引用。所以在你执行Config resultante = new Config(dada.tabela); 之后,resultancedadatabela 都将引用/指向同一个数组。

您可能想要做的是创建dada.tabela 的浅拷贝,然后将该浅拷贝传递给Config 的构造函数以实例化resultante

试试:

Config resultante = new Config(dada.tabela.clone());

Config resultante = new Config(Arrays.copyOf(dada.tabela, dada.tabela.length));

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2011-08-30
    • 2017-04-23
    • 2019-08-30
    • 2015-01-06
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多