Java:如何打印没有方括号和逗号的数组

Java: how to print array without square brackets and commas

这是我用于我的程序的代码。我很难按照我想要的方式显示它,即没有括号和逗号。 我希望它像金字塔一样:

    X                                              #      
   XXX                                            ###     
  XXXXX                                          #####    
 XXXXXXX                                        #######   
XXXXXXXXX                                      #########  

我的代码给出了我不想要的方括号和逗号。我得到:

[    X    ,    XXX   ,   XXXXX  ,  XXXXXXX , XXXXXXXXX]  
[]  
[]  
[]  
[]  
[    #    ,    ###   ,   #####  ,  ####### , #########]  

我的代码:

Stack stackA = new Stack();   
stackA.push("    X    ");
stackA.push("   XXX   ");
stackA.push("  XXXXX  ");
stackA.push(" XXXXXXX ");
stackA.push("XXXXXXXXX");

Stack stackB = new Stack();
Stack stackC = new Stack();
Stack stackD = new Stack();
Stack stackE = new Stack();

Stack stackF = new Stack();
stackF.push("    #    ");
stackF.push("   ###   ");
stackF.push("  #####  ");
stackF.push(" ####### ");
stackF.push("#########");

Stack[] combine = new Stack[6];
combine[0] = stackA;
combine[1] = stackB;
combine[2] = stackC;
combine[3] = stackD;
combine[4] = stackE;
combine[5] = stackF;

for (int i = 0; i < combine.length; i++)
{
    System.out.print(combine[i] + "  ");
    System.out.println();
}

你的方括号 [] 似乎来自空的 Stacks。

所以在你的 for 循环中确保不要打印空堆栈。

为了避免逗号,不要使用自动 toString() 打印堆栈,而是自己迭代它。

你需要第二个 for 循环:

for (int i = 0; i < combine.length; i++) {
    if (combine[i].size() > 0) {
        for (Object obj : combine[i]) {
            System.out.println(obj);
        }
    }
}

这将打印:

    X    
   XXX   
  XXXXX  
 XXXXXXX 
XXXXXXXXX
    #    
   ###   
  #####  
 ####### 
#########
    for (int line = 0; line <= 5; line++)
    {
        for (int i = 0; i < combine.length; i++) {
            Stack st = combine[i];
            if (st.size() > line) {
                System.out.print(st.get(line) + "  ");
            } else {
                System.out.print("           ");
            }
        }
        System.out.println();
    }

这会打印

    X                                              #      
   XXX                                            ###     
  XXXXX                                          #####    
 XXXXXXX                                        #######   
XXXXXXXXX                                      #########  

挑战包括:

  • 您只能打印 System.out,因此一次打印一个金字塔不会为您提供您想要的金字塔并排输出。而不是在每一行上,我们需要从每个堆栈中打印一个元素,该元素的高度足以在该行上包含一个元素。对于不够高的堆栈,我打印一个空白字符串以确保以下堆栈正确排列。
  • 我假设没有任何金字塔高于 5,并且所有金字塔元素的宽度正好为 9 个字符。如果需要,可以改进代码以考虑其他尺寸。

为了更好地使用 Java 库 classes,您可以考虑以下内容。不是你问的,不想用的请忽略

  • 使用泛型。例如 Stack<String> stackA = new Stack<>();。这将允许您将从堆栈中获取的元素作为 String 个对象来处理,而不仅仅是 Objects.
  • 因为泛型 classes 在数组中并不总是很好地工作,你可以使用 List 代替你的数组,例如 List<Stack<String>> combine = new ArrayList<>(); (可选地给出建议的容量: new ArrayList<>(6)).
  • Stack class 被认为是遗留的。文档说您应该更喜欢 Deque 界面。我推荐ArrayDequeclass,它实现了接口。喜欢:

    Deque<String> stackA = new ArrayDeque<>(5);
    
    List<Deque<String>> combine = new ArrayList<>(6);
    combine.add(stackA);
    

    要将 Deque 用作堆栈,您可以使用其 addFirst 方法进行推送,并使用其 removeFirst 进行弹出。在 the documentation.

  • 中有解释
  • 您可以使用增强的 for 循环,例如 for (Deque<String> pyramid : combine)

PS 如果你想让你的栈从底部开始增长,你可能应该先压最宽的元素,然后以相反的顺序打印行。你很快就会知道的。

如果您不需要 combine 堆栈数组,也许这段代码会有所帮助。

    while (!stackA.empty()) {
        stackB.push(stackA.pop());
        stackC.push(stackF.pop());
    }

    while (!stackB.empty()) {
        System.out.println(stackB.pop() + "        " + stackC.pop());
    }

输出:

    X                #    
   XXX              ###   
  XXXXX            #####  
 XXXXXXX          ####### 
XXXXXXXXX        #########

两个堆栈的大小相同。所以循环时间是一样的。您知道 LIFO(后进先出)是基本的堆栈。在第一个循环中,我弹出了两个 Stacks 以进行相反的顺序。在最后一个循环中,我只是弹出并打印了堆栈。