Java 打印阵列堆栈

Java 打印阵列堆栈,java,Java,在函数fillStackWithArray()中对数组执行一些操作,操作完成后,数组被推入堆栈并再次重复 但是当我试图打印堆栈时,问题就出现了。它给了我错误的答案 输出: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 预期产出: 5 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1

在函数
fillStackWithArray()
中对数组执行一些操作,操作完成后,数组被推入堆栈并再次重复

但是当我试图打印堆栈时,问题就出现了。它给了我错误的答案

输出:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 预期产出:

5 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 5 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 代码:

import java.util.Stack;
公共类ArraysOnStack{
公共静态void main(字符串[]args){
int-sizeOfArray=5;
堆栈=fillStackWithArray(5);
打印堆栈(stack);
}
专用静态void打印堆栈(堆栈){
而(!stack.empty()){
int[]arr=stack.pop();
对于(int i=0;i

PS:操作是随机的,只是为了填充数组。但我的问题与这种情况有关。

您在fillStackWithArray的堆栈中推送相同的
int[]
。Java中的int数组是Object的子类,因此它是Object类型。在循环内创建
int[]
数组

for (int i = 0; i < size; i++) {
   int[] arr = new int[size];
   ...
}
for(int i=0;i
您正在fillStackWithArray的堆栈中推送相同的
int[]
。Java中的int数组是Object的子类,因此它是Object类型。在循环内创建
int[]
数组

for (int i = 0; i < size; i++) {
   int[] arr = new int[size];
   ...
}
for(int i=0;i
  • 推送到堆栈上的
    int[]
    在循环外部初始化。同一数组在后续迭代中更新。您需要在循环中声明
    int[]
    数组

  • 分配给变量
    i
    的值应从1到
    i开始
    
  • 推送到堆栈上的
    int[]
    在循环外部初始化。同一数组在后续迭代中更新。您需要在循环中声明
    int[]
    数组


  • fillStackWithArray()
    函数中,分配给变量
    i
    的值应从1到
    i开始。您已经创建了一个数组
    arr
    ,并且在每次迭代中都要更改相同的
    arr
    。 要解决此问题,请为外部循环的每个迭代创建一个新数组。
    要理解这个问题,请阅读有关深度复制和按引用传递的内容。

    fillStackWithArray()
    函数中,您创建了一个数组
    arr
    ,并且在每次迭代中都更改相同的
    arr
    。 要解决此问题,请为外部循环的每个迭代创建一个新数组。 要理解这个问题,请阅读关于深度复制和引用传递的内容。

    试试这个

    private static Stack<int[]> fillStackWithArray (int size) {
        Stack<int[]> stack = new Stack<>();
        int[] arr = new int[size];
    
        // Some Operation that fills Stack with Arrays.
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                arr[j] = i + 1;                // changed
            }
            // Pushing the array into stack on which some operation
            // is performed.
            stack.push(arr.clone());           // changed
        }
    
        return stack;
    }
    
    试试这个

    private static Stack<int[]> fillStackWithArray (int size) {
        Stack<int[]> stack = new Stack<>();
        int[] arr = new int[size];
    
        // Some Operation that fills Stack with Arrays.
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                arr[j] = i + 1;                // changed
            }
            // Pushing the array into stack on which some operation
            // is performed.
            stack.push(arr.clone());           // changed
        }
    
        return stack;
    }
    

    请阅读:我尝试过调试。您正在编辑相同的数组。将数组初始化移到循环的第一个
    中。请阅读:我确实尝试过调试。您正在编辑同一个数组。将数组初始化移动到循环的第一个
    中。您还可以解释为什么使用
    arr.clone()
    :)您还可以解释为什么使用
    arr.clone()
    :)
    5 5 5 5 5 
    4 4 4 4 4 
    3 3 3 3 3 
    2 2 2 2 2 
    1 1 1 1 1