gpt4 book ai didi

java - java 按引用 vs 按值

转载 作者:行者123 更新时间:2023-12-01 15:00:40 25 4
gpt4 key购买 nike

我正在尝试解决著名的8谜题,其中一个3*3的正方形填满了1个空槽和8个数字,解决的方法是将其恢复到原始状态。

为此,我有一个 arraylist 的“状态”,它存储数字 0~9,代表拼图。

解决方案涉及产生多种可能的移动状态,这意味着我保存了每一个合法的移动以及由此产生的谜题。这是使用以下方法完成的,但我的 swapAndStore 不会每次都编辑原始传递的数组。相反,当在下面的 genSuccessors() 中调用时,它将在第一个 if 条件下正常工作,然后对第一个 if 的结果应用下一个 if 条件。我以为我通过创建一个名为“oldBoard”的新拼图状态来保存原始输入拼图以供将来引用来解决该问题,但这也不起作用。一位 friend 告诉我,这可能与引用问题有关,我不太掌握。我知道当 x=0, y=1 时,java 不会执行 swap(x,y) 以便 x = 1, y=0,但看不到这在这里如何应用。有什么建议吗?

   private void swapAndStore(int d1, int d2, ArrayList<State> s)
{
//int[] cpy = copyBoard(curBoard);
int[] cpy = new int [curBoard.length];
System.arraycopy(curBoard,0,cpy,0,curBoard.length);
int[] oldBoard = new int [curBoard.length];
System.arraycopy(curBoard,0,oldBoard,0,curBoard.length);
int temp = cpy[d1];
cpy[d1] = cpy[d2];
cpy[d2] = temp;
s.add((new State(cpy)));
curBoard = oldBoard;
System.out.println("swapandstore storing" );
s.get(s.size()-1).printState();

}

public ArrayList<State> genSuccessors()
{
ArrayList<State> successors = new ArrayList<State>();
int hole = getHole();

// try to generate a state by sliding a tile leftwise into the hole
// if we CAN slide into the hole
if (hole != 0 && hole != 3 && hole != 6)
{
/*
* we can slide leftwise into the hole, so generate a new state for
* this condition and throw it into successors
*/;
System.out.println("left");
swapAndStore(hole - 1, hole, successors);
}

// try to generate a state by sliding a tile topwise into the hole
if (hole != 6 && hole != 7 && hole != 8)
{
System.out.println("top");
swapAndStore(hole + 3, hole, successors);
}

最佳答案

Java 是按值传递的 - 总是

原语按值传递;对象引用按值传递。

这意味着您无法更改引用的值。但对于对象,您可以更改它们的状态 - 如果它们是可变的。

所以你可以这样做:

package cruft;

import java.io.PrintStream;

/**
* ArraySwapDemo description here
* @author Michael
* @link
* @since 12/3/12 9:48 PM
*/
public class ArraySwapDemo {

public static void main(String[] args) {
System.out.println(String.format("before: %s", arrayToString(args)));
swapValues(args, 0, args.length-1);
System.out.println(String.format("after : %s", arrayToString(args)));
}

// No checks for proper indexes, but you get the idea.
private static void swapValues(String[] args, int i, int j) {
String temp = args[i];
args[i] = args[j];
args[j] = temp;
}

public static String arrayToString(String [] array) {
StringBuffer buffer = new StringBuffer(1024);
buffer.append('{');
for (int i = 0; i < array.length-1; ++i) {
buffer.append(array[i]).append(',');
}
buffer.append(array[array.length-1]).append('}');
return buffer.toString();
}

}

如果我在命令行上使用四个字符串运行它 - foo bar baz bat - 我得到这个结果:

java cruft.ArraySwapDemo foo bar baz bat
before: {foo,bar,baz,bat}
after : {bat,bar,baz,foo}

Process finished with exit code 0

关于java - java 按引用 vs 按值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com