Kanth
Kanth

Reputation: 47

How to get the following formatted output?

I wrote the code to get the following formatted output, but when I enter number of rows in double digits, the output format changes. Why? How can I fix this?

      1
    1 2 1
  1 2 3 2 1
1 2 3 4 3 2 1

Here is my code:

import java.util.*;
class PTri {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the no. of rows for which " +
                "triangle has to be constructed");
        int numrow = sc.nextInt();
        for (int i = 1; i <= numrow; i++) {
            for (int j = 1; j <= numrow - i; j++) {
                System.out.print("  ");
            }
            for (int k = 1; k < i * 2; k++) {
                System.out.print(Math.min(k, i * 2 - k) + " ");
            }
            System.out.println();
        }
    }
}

Upvotes: 3

Views: 743

Answers (3)

user14940971
user14940971

Reputation:

You can use String.format method:

  • "%2d" - format as a two-digit number.
  • "%02d" - format as a two-digit number with leading zeros.

Example:

// int n = 5;
int n = 12;
// number of digits
int digits = String.valueOf(n).length();
// format string
String format = "%" + digits + "d";
// output
System.out.println("n=" + n + ", format=" + format);
IntStream.rangeClosed(1, n)
        .mapToObj(i -> IntStream.rangeClosed(-n, i)
                .map(Math::abs)
                .map(j -> j = i - j)
                .filter(j -> j != 0)
                .mapToObj(j -> j > 0 ?
                        String.format(format, j) : " " .repeat(digits))
                .collect(Collectors.joining(" ")))
        .forEach(System.out::println);

Output:

n=5, format=%1d
        1
      1 2 1
    1 2 3 2 1
  1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
n=12, format=%2d
                                  1
                               1  2  1
                            1  2  3  2  1
                         1  2  3  4  3  2  1
                      1  2  3  4  5  4  3  2  1
                   1  2  3  4  5  6  5  4  3  2  1
                1  2  3  4  5  6  7  6  5  4  3  2  1
             1  2  3  4  5  6  7  8  7  6  5  4  3  2  1
          1  2  3  4  5  6  7  8  9  8  7  6  5  4  3  2  1
       1  2  3  4  5  6  7  8  9 10  9  8  7  6  5  4  3  2  1
    1  2  3  4  5  6  7  8  9 10 11 10  9  8  7  6  5  4  3  2  1
 1  2  3  4  5  6  7  8  9 10 11 12 11 10  9  8  7  6  5  4  3  2  1

See also: Print the sum of the row and column in a 2d array after each row

Upvotes: 0

Pranav Kevadiya
Pranav Kevadiya

Reputation: 537

It's because the value in double digit will change the whole architecture.The set will shift to right one place. So you can put a condition like this. I have added one extra space between numbers to improve visibility.

import java.util.*;
class PTri {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the no. of rows for which " +
                "triangle has to be constructed");
        int numrow = sc.nextInt();
        for (int i = 1; i <= numrow; i++) {
            for (int j = 1; j <= (numrow - i); j++) {
                System.out.print("    ");
            }
            for (int k = 1; k < i * 2; k++) {
                int temp = Math.min(k, i * 2 - k);

                if (temp > 9) {
                    System.out.print(temp + "  ");
                } else {
                    System.out.print(temp + "   ");
                }
            }
            System.out.println();
        }
    }
}

Upvotes: 2

semTex
semTex

Reputation: 343

In this example I counted the digits, and for every digit I add an extra space. The output of the value is formatted with leading zeros (digit-count).

public static void main(final String[] args) {
    final Scanner sc = new Scanner(System.in);
    System.out.println("Enter the no. of rows for which " +
            "triangle has to be constructed");
    final int numrow = 100;// sc.nextInt();

    final int digits = (int) Math.log10(numrow) + 1;

    for (int i = 1; i <= numrow; i++) {
        for (int j = 1; j <= numrow - i; j++) {
            System.out.print(" ");
            for (int l = 0; l < digits; l++) {
                System.out.print(" ");
            }
        }
        for (int k = 1; k < i * 2; k++) {
            final int value = Math.min(k, i * 2 - k);
            System.out.print(String.format("%0" + digits + "d ", value));
        }
        System.out.println();
    }
}

Upvotes: 1

Related Questions