Java: как напечатать массив без квадратных скобок и запятых - PullRequest
0 голосов
/ 27 мая 2018

Это мой код, который я использовал для своей программы.У меня возникают трудности с отображением так, как я хочу, без скобок и запятых.Я хочу, чтобы это было похоже на пирамиды:

    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();
}

Ответы [ 4 ]

0 голосов
/ 27 мая 2018

Возможно, этот код поможет, если вам не нужен массив стека 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 (последний пришел первым вышел) - это базовый стек.В первом цикле я вытащил два стека для обратного порядка.В последнем цикле я просто вытолкнул и напечатал стопку.

0 голосов
/ 27 мая 2018

вам нужна секунда для цикла:

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
    #    
   ###   
  #####  
 ####### 
#########
0 голосов
/ 27 мая 2018
    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 вы можете рассмотреть следующее.Это не то, что вы просили, и, пожалуйста, игнорируйте, если вы не хотите его использовать.

  • Используйте дженерики.Например Stack<String> stackA = new Stack<>();.Это позволит вам обрабатывать элементы, которые вы получаете из стека, как String объекты, а не просто Object s.
  • Поскольку универсальные классы не всегда хорошо работают внутри массивов, вы можете использовать List вместо вашего массива, например List<Stack<String>> combine = new ArrayList<>(); (опционально укажите предлагаемую емкость: new ArrayList<>(6)).
  • Класс Stack считается устаревшим.В документах говорится, что вы должны предпочесть интерфейс Deque.Я рекомендую класс ArrayDeque, он реализует интерфейс.Например:

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

    Чтобы использовать Deque в качестве стека, вы используете метод addFirst для push и его removeFirst для pop.Это объяснено в документации .

  • Вы можете использовать расширенную петлю for, например for (Deque<String> pyramid : combine).

PS Если вы хотеличтобы ваши стеки росли снизу, вам, вероятно, следует сначала нажать на самый широкий элемент и напечатать строки в обратном порядке.Вы узнаете достаточно скоро.

0 голосов
/ 27 мая 2018

Похоже, ваши квадратные скобки [] взяты из пустых Stack s.

Так что в цикле for следите за тем, чтобы не печатать пустые стопки.

Чтобы избежать запятыхне печатайте стопку с ее автоматическим toString(), а выполняйте ее самостоятельно.

...