Как я могу создать Java-программу, которая заставляет числа выравниваться по правой стороне?

Моя цель - java-приложение, которое берет число от пользователя. Запустите 1 и запишите его в консоль. Каждая новая строка серии будет увеличиваться на 1 до тех пор, пока не будет получен номер токена от пользователя. Важно выровнять каждую строку по правой стороне.

    Scanner in = new Scanner(System.in);
    int numberOfLines = in.nextInt();

    for (int rows = 1; rows <= numberOfLines; rows++) {
        for (int i = numberOfLines - rows; i >= 1; i--) {
            System.out.print("  ");
        }
        for (int col = rows; col >= 1; col--) {
            System.out.printf(" %d",col);
        }
        System.out.println();
    }

                     1
                   2 1
                 3 2 1
               4 3 2 1
             5 4 3 2 1
           6 5 4 3 2 1
         7 6 5 4 3 2 1
       8 7 6 5 4 3 2 1
     9 8 7 6 5 4 3 2 1
   10 9 8 7 6 5 4 3 2 1
 11 10 9 8 7 6 5 4 3 2 1

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

stackoverflow.com/questions/15961130/…
Alberto Sinigaglia 20.12.2020 15:13

Честно говоря, я бы не стал беспокоиться о правильном форматировании вещей в консоли. В наши дни немногие «производственные» приложения основаны на консоли, и в других контекстах (например, на веб-страницах) есть настройки, позволяющие писать справа налево, а не слева направо.

ControlAltDel 20.12.2020 15:23

@control выглядит как задание по программированию.

Thorbjørn Ravn Andersen 20.12.2020 15:39

Я не вижу оператора if. Если вы не хотите показывать нам, чем мы можем вам помочь?

NomadMaker 20.12.2020 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
757
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш код отлично справляется со своей задачей. Единственная проблема, с которой вы сталкиваетесь, заключается в том, что она перестает работать должным образом, как только вы получаете числа, длина которых превышает 1 цифру: в вашем примере 10 и 11.

На самом деле это довольно сложно исправить — что, если я введу «120392»?

У вас есть несколько вариантов. Каждый вариант более удивителен, но также требует больше кода.

  1. Ограничьте свой ввод. Например, запретите ввод данных, превышающий 99, и предположите, что все числа имеют количество цифр, равное максимальному разрешенному числу (т. е. 2 цифры).
  2. Подсчитайте количество цифр во входных данных, затем предположим, что все числа имеют вычисленное количество цифр.
  3. Просто сделайте это правильно, с применяемым интервалом, увеличивающимся по мере увеличения числа цифр.

Если вы выберете первый или второй вариант, вы получите что-то вроде:

                                 1
                              2  1
                           3  2  1
                        4  3  2  1
                     5  4  3  2  1
                  6  5  4  3  2  1
               7  6  5  4  3  2  1
            8  7  6  5  4  3  2  1
         9  8  7  6  5  4  3  2  1
     10  9  8  7  6  5  4  3  2  1
 11  10  9  8  7  6  5  4  3  2  1

Обратите внимание, что здесь гораздо больше пробелов, чем в вашем примере (2 пробела между, например, каждым 4 и 3 вместо 1.

Так как? Для № 1 и № 2 вам нужен System.out.printf("%2d"); - это означает: напечатать число, но если для этого требуется менее 2 символов, левый дополнить пробелами.

Для # 1 вы жестко задаете «2» (и жестко задаете ограничение 99; альтернативно, жестко задаете 3 пробела и ограничение 999). Для # 2 вы получаете свой ввод, а затем выясняете, сколько цифр это. Что-то вроде String.valueOf(limit).length(); сделает это, затем вы создадите строку формата, используя эту длину.

Для # 3 вы отслеживаете, какое число вы не печатаете в своем цикле System.out.print(" ");, чтобы вы могли выяснить, какой длины должно быть пустое пространство, которое вам нужно сделать: если вы не печатаете 10, вам нужно 3 пробела . Если вы не печатаете 500, вам понадобится 4. Если вы не печатаете 5, вам нужно 2.

Для № 2 и № 3: printf("%4s", ""); печатает 4 пробела. Это то, что вы использовали бы, чтобы попросить java напечатать X пробелов. Это понадобится вам для решений № 2 и № 3.

Звучит как домашнее задание первой недели. Я думаю, что № 1 является наиболее подходящим.

Ответ принят как подходящий

Вот другой способ думать об этом, используя конкатенацию строк.

Сначала вы можете сгенерировать последнюю строку, чтобы определить максимальную ширину каждой строки. Затем для каждой строки вы считаете в обратном порядке от номера текущей строки до 1, чтобы вы знали ширину только части чисел. Наконец, вы добавляете количество пробелов, необходимое для того, чтобы текущая строка была такой же ширины, как и предыдущая строка. Обратите внимание, что это ужасно неэффективное использование строк, но на самом деле я демонстрирую другой алгоритм. Если сделать эту память эффективной, ее будет труднее понять. Также обратите внимание, что правильный вывод зависит от среды, в которой вы работаете, и от того, как она отображает длинные строки. Некоторые системы добавят полосу прокрутки, в то время как другие могут привести к переносу строк.

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("Number of rows? ");
    int numberOfLines = in.nextInt();

    if (numberOfLines >= 1) {
        int totalWidth = 0;
        // add up the widths of the numbers themselves
        for (int number = 1; number <= numberOfLines; number++) {
            totalWidth = totalWidth + ("" + number).length();
        }
        // add in the spaces in-between the numbers
        totalWidth = totalWidth + (numberOfLines - 1);

        // now generate each row by counting backwards from the current row number
        for (int rowNumber = 1; rowNumber<=numberOfLines; rowNumber++) {
            String row = "";
            for (int i=rowNumber; i>=2; i--) {
                row = row + i + " ";
            }        
            row = row + "1";

            // prepend the spaces in front to make it as wide as the last row
            int paddingLength = totalWidth - row.length();
            for(int i=1; i<=paddingLength; i++) {
                row = " " + row;
            }

            // output the row
            System.out.println(row);
        } 
    }
    else {
        System.out.println("Number of rows must be positive!");
    }
}

Пример вывода с 25 строками:

Number of rows? 25
                                                                1
                                                              2 1
                                                            3 2 1
                                                          4 3 2 1
                                                        5 4 3 2 1
                                                      6 5 4 3 2 1
                                                    7 6 5 4 3 2 1
                                                  8 7 6 5 4 3 2 1
                                                9 8 7 6 5 4 3 2 1
                                             10 9 8 7 6 5 4 3 2 1
                                          11 10 9 8 7 6 5 4 3 2 1
                                       12 11 10 9 8 7 6 5 4 3 2 1
                                    13 12 11 10 9 8 7 6 5 4 3 2 1
                                 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                              15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                           16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                        17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                     18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                  19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
               20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
            21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
         22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
   24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Чтобы выровнять 2 цифры по правому краю, одним из способов будет - после цикла for «col» преобразовать каждую цифру в строку, затем перевернуть ее, а затем распечатать. Если вы не преобразуете его в строку, то такие числа, как 10,20,30 и т.д., будут напечатаны как 1,2,3 и т.д.

for (int rows = 1; rows <= numberOfLines; rows++) {
    for (int i = numberOfLines - rows; i >= 1; i--) {
        System.out.print("  ");
    }
    for (int col = rows; col >= 1; col--) {
      if (col>9){
        COL=Integer.toString(col);
        for(int i=COL.length();i>=0;i--)
        rev=rev+COL.charAt(i);
        System.out.printf(" %d",rev);
      }
      else
      System.out.printf("%d",col);
    
    }
    System.out.println();
}

Другие вопросы по теме