按引用与按值java
我试图解决著名的8字谜,其中一个3*3的正方形填充了1个空槽和8个数字,解决的方法是将其恢复到原始状态 为此,我有一个arraylist的“状态”,它存储数字0~9,表示谜题 解决方案包括产生大量可能的移动状态,这意味着我保存了所有合法的移动和由此产生的谜题。这是使用以下方法完成的,但我的swapAndStore不会每次都编辑原始传递的数组。相反,当在下面的genSuccessors()中调用时,它将对第一个if条件正常工作,然后对第一个if的结果应用下一个if条件。我想我通过制作一个名为“oldBoard”的新拼图状态来修复这个问题,以保存原始输入拼图以供将来参考,但这也不起作用。一位朋友告诉我,这可能与参考问题有关,我不能很好地理解。我知道当x=0,y=1时,java不会进行交换(x,y),因此x=1,y=0,但看不出这在这里是如何应用的。 建议按引用与按值java,java,reference,state,Java,Reference,State,我试图解决著名的8字谜,其中一个3*3的正方形填充了1个空槽和8个数字,解决的方法是将其恢复到原始状态 为此,我有一个arraylist的“状态”,它存储数字0~9,表示谜题 解决方案包括产生大量可能的移动状态,这意味着我保存了所有合法的移动和由此产生的谜题。这是使用以下方法完成的,但我的swapAndStore不会每次都编辑原始传递的数组。相反,当在下面的genSuccessors()中调用时,它将对第一个if条件正常工作,然后对第一个if的结果应用下一个if条件。我想我通过制作一个名为“ol
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);
}
private void swapAndStore(int d1、int d2、ArrayList s)
{
//int[]cpy=复印机(路缘板);
int[]cpy=新的int[curBoard.length];
系统阵列副本(路缘板,0,cpy,0,路缘板长度);
int[]旧板=新int[路缘板长度];
系统阵列副本(路缘板,0,旧板,0,路缘板长度);
内部温度=cpy[d1];
cpy[d1]=cpy[d2];
cpy[d2]=温度;
s、 添加((新状态(cpy));
路缘板=旧板;
System.out.println(“swapandstore存储”);
s、 获取(s.size()-1.printState();
}
公共阵列列表genSuccessors()
{
ArrayList继承者=新的ArrayList();
int-hole=getHole();
//尝试通过将瓷砖向左滑入孔中来生成状态
//如果我们能滑进洞里
如果(孔!=0&&hole!=3&&hole!=6)
{
/*
*我们可以向左滑入孔中,因此为该孔生成一个新状态
*这一条件并将其抛给继任者
*/;
系统输出打印项次(“左”);
swapAndStore(孔-1,孔,继任者);
}
//尝试通过将瓷砖向上滑动到孔中来生成状态
如果(孔!=6&&hole!=7&&hole!=8)
{
System.out.println(“顶部”);
swapAndStore(孔+3,孔,后继);
}
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();
}
}
DarthVader说太长了,读不下去了。我想我知道他有阅读理解问题:我不确定我是否完全理解,你的交换和应用程序中的逻辑和我的差不多。有什么区别?我不知道,我不能真正地理解你的问题。我知道有可能在数组中交换值。rhaps您需要某种递归来生成游戏树。
java cruft.ArraySwapDemo foo bar baz bat
before: {foo,bar,baz,bat}
after : {bat,bar,baz,foo}
Process finished with exit code 0