Java 推送到队列引用或值

标签 java queue

鉴于我试图在 Java 中实现的规模较小:

int[][] arr = new int[2][2]{ 
    { 1, 0 },
    { 0, 1 }
};
int[][] path = null;

Queue<int[][]> q = new LinkedList<int[][]>();
q.add(arr);

while(q.size() != 0) {
    path = q.poll();    // pop the queue

    for (int i=0; i<2; i++) {
        for (int j=0; j<2; j++) {
            if (path[i][j] == 0) {
                path[i][j] = 1;
                q.add(path);
                path[i][j] = 0;
            }
        }
    }
}

我通过 NetBeans 跟踪了 while 和 for 循环内每次迭代的 q 内容。然而,它们具有相同的值。

我期望在第一次 for 循环执行结束时会出现这样的情况:

{ {1 , 1} , {0 , 1} } and { {1 , 0} , {1 , 1} }

但相反,它们是:

{ {1 , 0} , {0 , 1} } and { {1 , 0} , {0 , 1} }

这是数组 path 的最后一个值,因为嵌套 for 循环的第一次执行已经结束。

我应该怎么做才能使我推送到 q 的那个不是对 path 数组的引用?

最佳答案

尝试添加 path 数组的副本。

for (int i=0; i<2; i++) {
    for (int j=0; j<2; j++) {
        if (path[i][j] == 0) {
            path[i][j] = 1;

            // here
            int[][] copy = new int[2][2];
            for(int k=0; k<2; k++) {
                copy[k] = path[k].clone();
            }

            q.add(copy);

            path[i][j] = 0; // now, this does not affect the added element
        }
    }
}

编辑:您无法克隆 path 变量,因为数组的第一级上存在引用。

关于Java 推送到队列引用或值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20400453/

相关文章:

java - Amazon SQS 长轮询不返回所有消息

java - contentful - 使用 JAVA SDK 检索条目的所有翻译?

java - Android离线模式(应用上线时同步数据)

django - 如何在运行时创建 celery 队列,以便工作人员接收发送到该队列的任务?

C++ 聚合类型不完整,无法使用模板类定义

Python多处理使用队列写入同一个文件

java - Android:自定义ListView不会立即填充

java - 可以在 Play 2 框架中使用 Java NIO 同时发布和获取文件吗?

java - 需要变压器功能

go - 在 Go 中实现工作人员池