diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-miscellaneous-3/pom.xml
index 3cebdd09acdd..802cf7432090 100644
--- a/algorithms-miscellaneous-3/pom.xml
+++ b/algorithms-miscellaneous-3/pom.xml
@@ -30,6 +30,19 @@
guava
${guava.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.8.1
+
+
+
+ pl.pragmatists
+ JUnitParams
+ 1.1.0
+ test
+
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
new file mode 100644
index 000000000000..a67c54a92260
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
@@ -0,0 +1,49 @@
+package com.baeldung.algorithms.printtriangles;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class PrintTriangleExamples {
+
+ public static String printARightAngledTriangle(int N) {
+ StringBuilder result = new StringBuilder();
+ for (int r = 1; r <= N; r++) {
+ for (int j = 1; j <= r; j++) {
+ result.append("*");
+ }
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static String printAnIsoscelesTriangle(int N) {
+ StringBuilder result = new StringBuilder();
+ for (int r = 1; r <= N; r++) {
+ for (int sp = 1; sp <= N - r; sp++) {
+ result.append(" ");
+ }
+ for (int c = 1; c <= (r * 2) - 1; c++) {
+ result.append("*");
+ }
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static String printAnIsoscelesTriangleUsingSubstring(int N) {
+ StringBuilder result = new StringBuilder();
+ String helperString = StringUtils.repeat(' ', N - 1) + StringUtils.repeat('*', N * 2 - 1);
+
+ for (int r = 0; r < N; r++) {
+ result.append(helperString.substring(r, N + 2 * r));
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(printARightAngledTriangle(5));
+ System.out.println(printAnIsoscelesTriangle(5));
+ System.out.println(printAnIsoscelesTriangleUsingSubstring(5));
+ }
+
+}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
new file mode 100644
index 000000000000..6fa6584b8eb4
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.algorithms.printtriangles;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(JUnitParamsRunner.class)
+public class PrintTriangleExamplesUnitTest {
+
+ private static Object[][] rightAngledTriangles() {
+ String expected0 = "";
+
+ String expected2 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator();
+
+ String expected5 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator()
+ + "***" + System.lineSeparator()
+ + "****" + System.lineSeparator()
+ + "*****" + System.lineSeparator();
+
+ String expected7 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator()
+ + "***" + System.lineSeparator()
+ + "****" + System.lineSeparator()
+ + "*****" + System.lineSeparator()
+ + "******" + System.lineSeparator()
+ + "*******" + System.lineSeparator();
+
+ return new Object[][] {
+ { 0, expected0 },
+ { 2, expected2 },
+ { 5, expected5 },
+ { 7, expected7 }
+ };
+ }
+
+ @Test
+ @Parameters(method = "rightAngledTriangles")
+ public void whenPrintARightAngledTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printARightAngledTriangle(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+ private static Object[][] isoscelesTriangles() {
+ String expected0 = "";
+
+ String expected2 = " *" + System.lineSeparator()
+ + "***" + System.lineSeparator();
+
+ String expected5 = " *" + System.lineSeparator()
+ + " ***" + System.lineSeparator()
+ + " *****" + System.lineSeparator()
+ + " *******" + System.lineSeparator()
+ + "*********" + System.lineSeparator();
+
+ String expected7 = " *" + System.lineSeparator()
+ + " ***" + System.lineSeparator()
+ + " *****" + System.lineSeparator()
+ + " *******" + System.lineSeparator()
+ + " *********" + System.lineSeparator()
+ + " ***********" + System.lineSeparator()
+ + "*************" + System.lineSeparator();
+
+ return new Object[][] {
+ { 0, expected0 },
+ { 2, expected2 },
+ { 5, expected5 },
+ { 7, expected7 }
+ };
+ }
+
+ @Test
+ @Parameters(method = "isoscelesTriangles")
+ public void whenPrintAnIsoscelesTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printAnIsoscelesTriangle(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ @Parameters(method = "isoscelesTriangles")
+ public void whenPrintAnIsoscelesTriangleUsingSubstringIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printAnIsoscelesTriangleUsingSubstring(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+}