Как я могу отформатировать интервал между столбцами для Multi Table? - PullRequest
0 голосов
/ 14 октября 2019

В настоящее время я пытаюсь использовать java для создания мультиблика со следующим выводом:

    0  1  2  3  4  5  6  7  8  9
 +------------------------------
0|  0  0  0  0  0  0  0  0  0  0
1|  0  1  2  3  4  5  6  7  8  9
2|  0  2  4  6  8 10 12 14 16 18
3|  0  3  6  9 12 15 18 21 24 27
4|  0  4  8 12 16 20 24 28 32 36
5|  0  5 10 15 20 25 30 35 40 45
6|  0  6 12 18 24 30 36 42 48 54
7|  0  7 14 21 28 35 42 49 56 63
8|  0  8 16 24 32 40 48 56 64 72
9|  0  9 18 27 36 45 54 63 72 81

Однако вместо приведенного выше результата я получил следующее:

   0   1   2   3   4   5   6   7   8   9
 +-------------------------------------------
0| 0  0  0  0  0  0  0  0  0  0
1| 0  1  2  3  4  5  6  7  8  9
2| 0  2  4  6  8  10  12  14  16  18
3| 0  3  6  9  12  15  18  21  24  27
4| 0  4  8  12  16  20  24  28  32  36
5| 0  5  10  15  20  25  30  35  40  45
6| 0  6  12  18  24  30  36  42  48  54
7| 0  7  14  21  28  35  42  49  56  63
8| 0  8  16  24  32  40  48  56  64  72
9| 0  9  18  27  36  45  54  63  72  81

Поэтому я хотел бы знать, есть ли способ решить проблему? Спасибо.

Вот код.

import java.util.*;
public class MultiTable 
{
    public static void main(String[] args) 
    {
        int x = 9;
        System.out.print("   ");
        for(int k = 0; k<=x ;k++ ) {
            System.out.print( k + "   ");
        }

       System.out.println("\n +-------------------------------------------");
        for(int i = 0 ;i<=x ;i++) {
             System.out.print(i+ "| ");
            for(int j=0;j<=x ;j++) {
             System.out.print(j*i + "  ");
            }
            System.out.println();
        }
        System.out.println("\n"); 
        System.out.println("\n\n");
    }
}

Спасибо.

Ответы [ 4 ]

0 голосов
/ 14 октября 2019

Вы можете обновить свой код, как показано ниже, чтобы получить желаемый результат. Ниже приведены изменения:

1) 1-й System.out.println должен иметь дополнительный пробел.
2) Измените логику для печати пробела перед числом, а не после него, чтобы решить, нет ли у него пробелов для него.
2) Внутри внутреннего цикла for добавьте условие if, чтобы определить количество пробелов в зависимости от длины соответствующего числа после него.

import java.util.*;
public class MultiTable 
{
    public static void main(String[] args) 
    {
      public static void main(final String[] args) {
    final int x = 9;
    System.out.print("    ");
    for (int k = 0; k <= x; k++) {
      System.out.print(k + "  ");
    }

    System.out.println("\n +------------------------------");
    for (int i = 0; i <= x; i++) {
      System.out.print(i + "|");
      for (int j = 0; j <= x; j++) {
        if (String.valueOf(j * i).length() == 1) {
          System.out.print("  " + j * i);
        } else {
          System.out.print(" " + j * i);
        }
      }
      System.out.println();
    }
    System.out.println("\n");
    System.out.println("\n\n");
  }
}

Вывод кода:

    0  1  2  3  4  5  6  7  8  9  
 +------------------------------
0|  0  0  0  0  0  0  0  0  0  0
1|  0  1  2  3  4  5  6  7  8  9
2|  0  2  4  6  8 10 12 14 16 18
3|  0  3  6  9 12 15 18 21 24 27
4|  0  4  8 12 16 20 24 28 32 36
5|  0  5 10 15 20 25 30 35 40 45
6|  0  6 12 18 24 30 36 42 48 54
7|  0  7 14 21 28 35 42 49 56 63
8|  0  8 16 24 32 40 48 56 64 72
9|  0  9 18 27 36 45 54 63 72 81
0 голосов
/ 14 октября 2019

Печатайте отформатированные строки вместо печати как есть.

Либо вы можете распечатать отформатированную строку непосредственно на выход, используя System.out.printf()

или

Вы можете сначала отформатировать строку, используя String.format(), а затем распечатать ее, используя println.

В вашем случае необходимо, чтобы целые числа были как минимум 2персонажи длинные. Если целое число имеет слишком мало цифр, вы можете заполнить его пробелами. Вот как вы можете это сделать:

int number = 1;

// printf approach
System.out.printf("%3d", number);

// Formatted string approach
String formatted = String.format("%3d", number);
System.out.print(formatted);

В формате вы можете увидеть %3d. Это означает:

  • % начало форматирования
  • 3 по правому краю, 3 пробела (отрицательное число будет по левому краю). Я использую 3, чтобы числа не слипались.
  • d десятичное число (целое число-10) будет отформатировано

Подробнее о форматерах читайте в Официальные документы Java

0 голосов
/ 14 октября 2019
  1. числа управляют заполнением пробела слева (напротив кода, который добавляет заполнение справа)

  2. если число состоит из двух цифр, выpad с одним пробелом, иначе два пробела

    for(int i = 0 ;i<=x ;i++) {
         System.out.print(i+ "|");  // leave padding to the number printing loop
         for(int j = 0 ; j <= x ; j++) {
             int numbertoPrint = j*i;
             int spacePadding = j == 0 || numbertoPrint >= 10 ? 1 : 2;  // one space at the beginning or if two digit number
             System.out.print(" ".repeat(spacePadding) + numbertoPrint);  // repeat() available since java 11
         }
         System.out.println();
    }
    
0 голосов
/ 14 октября 2019

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

for(int j=0;j<=x ;j++) {
    String resStr0 = Integer.valueOf(j*i).toString();
    String resStr = resStr0.length() < 2 ? resStr0+" " : resStr0;
    System.out.print(resStr + "  ");
}

   0   1   2   3   4   5   6   7   8   9   
 +-------------------------------------------
0| 0   0   0   0   0   0   0   0   0   0   
1| 0   1   2   3   4   5   6   7   8   9   
2| 0   2   4   6   8   10  12  14  16  18  
3| 0   3   6   9   12  15  18  21  24  27  
4| 0   4   8   12  16  20  24  28  32  36  
5| 0   5   10  15  20  25  30  35  40  45  
6| 0   6   12  18  24  30  36  42  48  54  
7| 0   7   14  21  28  35  42  49  56  63  
8| 0   8   16  24  32  40  48  56  64  72  
9| 0   9   18  27  36  45  54  63  72  81  
...