Reputation: 5
I am trying a Challenge in Dcoder and my answer is same to the expected output however I am thinking that the problem is about the given situation to remove the trailing whitespaces at the end of each line.
To make it clear, this is the problem:
You need to print this pattern up to
N
, e.g.N = 3
Expected Output:
1 1 2 1 2 3
Do not leave trailing spaces at the end of each line!
This is my Code:
String sp = " ";
for (int rows = 1; rows <= range; rows++) { //rows
for (int cols = 1; cols <= rows; cols++) {
System.out.print(Integer.toString(cols) + sp);
}
System.out.println(sp.trim());
}
I tried concatenating Integer.toString(cols)
and sp
then another sp.trim()
output is also the same but challenge doesn't say that its correct, why is this happening? Can anybody explain or is there something wrong with my code?
Upvotes: 0
Views: 1574
Reputation:
Since Java 8 you can use Collectors.joining
method to concatenate strings with whitespaces in between:
int n = 5;
IntStream.rangeClosed(1, n)
// row of numbers
.mapToObj(i -> IntStream.rangeClosed(1, i)
// number as string
.mapToObj(String::valueOf)
// join strings into one line
// with spaces in between
.collect(Collectors.joining(" ")))
// output line by line
.forEach(System.out::println);
Or you can use String.join
method with the same effect:
int n = 5;
for (int i = 1; i <= n; i++) {
// row of numbers
String[] row = new String[i];
for (int j = 0; j < i; j++) {
// number as string
row[j] = String.valueOf(j + 1);
}
// join an array of strings into
// one line with spaces in between
System.out.println(String.join(" ", row));
}
Output:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
See also: Adding a whitespace inside a List of strings?
Upvotes: 0
Reputation: 180
There you go
int range = 3;
for(int rows = 1; rows <= range; rows++ ) {
for(int cols = 1; cols <= rows; cols++ ) {
if (cols == rows) {
System.out.println(Integer.toString(cols));
} else {
System.out.print(Integer.toString(cols) + " ");
}
}
}
Upvotes: 1
Reputation: 241
String sp = " ";
for (int rows = 1; rows <= 3; rows++){ //rows
String pattern ="";
for (int cols = 1; cols <= rows; cols++)
pattern += Integer.toString(cols) + sp;
System.out.println(pattern.trim());
}
Upvotes: 0
Reputation: 18558
You are appending the whitespace sp
after every number in your second for
loop. That's why there is a trailing whitespace when you print out the lines.
You have several options, like using a StringBuilder
and .append()
the values and then print toString().trim()
, but here's a very simple extension of your code where I just hard-coded the range
by 4
:
public static void main(String[] args) {
String sp = " ";
for (int rows = 1; rows <= 4; rows++) {
for (int cols = 1; cols <= rows; cols++) {
// here you need to find out if it is the last number to be printed
if (cols == rows) {
// if it is, just print that number
System.out.print(Integer.toString(cols));
} else {
// otherwise print the number and the whitespace
System.out.print(Integer.toString(cols) + sp);
}
}
// force a linebreak
System.out.println();
}
}
which outputs
1
1 2
1 2 3
1 2 3 4
Alternative solution:
public static void main(String[] args) {
for (int rows = 1; rows <= 4; rows++) {
StringBuilder lineBuilder = new StringBuilder();
for (int cols = 1; cols <= rows; cols++) {
if (cols == rows) {
lineBuilder.append(Integer.toString(cols));
} else {
lineBuilder.append(Integer.toString(cols)).append(" ");
}
}
System.out.println(lineBuilder.toString());
}
}
Upvotes: 0