@@ -1,4 +1,4 @@
|
||||
## Relevant articles:
|
||||
## Relevant Articles:
|
||||
|
||||
- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
|
||||
- [Implementing Simple State Machines with Java Enums](https://www.baeldung.com/java-enum-simple-state-machine)
|
||||
|
||||
@@ -30,6 +30,19 @@
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.8.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>pl.pragmatists</groupId>
|
||||
<artifactId>JUnitParams</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
+49
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
+93
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package com.baeldung.algorithms.selectionsort;
|
||||
|
||||
public class SelectionSort {
|
||||
|
||||
public static void sortAscending(final int[] arr) {
|
||||
for (int i = 0; i < arr.length - 1; i++) {
|
||||
int minElementIndex = i;
|
||||
for (int j = i + 1; j < arr.length; j++) {
|
||||
if (arr[minElementIndex] > arr[j]) {
|
||||
minElementIndex = j;
|
||||
}
|
||||
}
|
||||
|
||||
if (minElementIndex != i) {
|
||||
int temp = arr[i];
|
||||
arr[i] = arr[minElementIndex];
|
||||
arr[minElementIndex] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void sortDescending(final int[] arr) {
|
||||
for (int i = 0; i < arr.length - 1; i++) {
|
||||
int maxElementIndex = i;
|
||||
for (int j = i + 1; j < arr.length; j++) {
|
||||
if (arr[maxElementIndex] < arr[j]) {
|
||||
maxElementIndex = j;
|
||||
}
|
||||
}
|
||||
|
||||
if (maxElementIndex != i) {
|
||||
int temp = arr[i];
|
||||
arr[i] = arr[maxElementIndex];
|
||||
arr[maxElementIndex] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.baeldung.algorithms.selectionsort;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class SelectionSortUnitTest {
|
||||
|
||||
@Test
|
||||
public void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() {
|
||||
int[] input = { 5, 4, 1, 6, 2 };
|
||||
SelectionSort.sortAscending(input);
|
||||
int[] expected = {1, 2, 4, 5, 6};
|
||||
assertArrayEquals("the two arrays are not equal", expected, input);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() {
|
||||
int[] input = { 5, 4, 1, 6, 2 };
|
||||
SelectionSort.sortDescending(input);
|
||||
int[] expected = {6, 5, 4, 2, 1};
|
||||
assertArrayEquals("the two arrays are not equal", expected, input);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.baeldung.metaprogramming
|
||||
|
||||
import groovy.transform.AutoClone
|
||||
import groovy.transform.Canonical
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.ToString
|
||||
import groovy.transform.TupleConstructor
|
||||
import groovy.util.logging.*
|
||||
|
||||
@Canonical
|
||||
@TupleConstructor
|
||||
@EqualsAndHashCode
|
||||
@ToString(includePackage=false, excludes=['id'])
|
||||
@Log
|
||||
@AutoClone
|
||||
class Employee {
|
||||
|
||||
long id
|
||||
String firstName
|
||||
String lastName
|
||||
int age
|
||||
|
||||
//method to catch missing property's getter
|
||||
def propertyMissing(String propertyName) {
|
||||
log.info "$propertyName is not available"
|
||||
"property '$propertyName' is not available"
|
||||
}
|
||||
|
||||
//method to catch missing property's setter
|
||||
def propertyMissing(String propertyName, propertyValue) {
|
||||
println "property '$propertyName' is not available"
|
||||
log.info "$propertyName is not available"
|
||||
"property '$propertyName' is not available"
|
||||
}
|
||||
|
||||
def methodMissing(String methodName, def methodArgs) {
|
||||
log.info "$methodName is not defined"
|
||||
"method '$methodName' is not defined"
|
||||
}
|
||||
|
||||
def logEmp() {
|
||||
log.info "Employee: $lastName, $firstName is of $age years age"
|
||||
}
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.baeldung.metaprogramming.extension
|
||||
|
||||
import com.baeldung.metaprogramming.Employee
|
||||
|
||||
class BasicExtensions {
|
||||
|
||||
static int getYearOfBirth(Employee self) {
|
||||
return (new Date().getYear() + 1900) - self.age;
|
||||
}
|
||||
|
||||
static String capitalize(String self) {
|
||||
return self.substring(0, 1).toUpperCase() + self.substring(1)
|
||||
}
|
||||
|
||||
static void printCounter(Integer self) {
|
||||
while (self>0) {
|
||||
println self
|
||||
self--
|
||||
}
|
||||
}
|
||||
|
||||
static Long square(Long self) {
|
||||
return self*self
|
||||
}
|
||||
|
||||
static BigDecimal cube(BigDecimal self) {
|
||||
return self*self*self
|
||||
}
|
||||
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package com.baeldung.metaprogramming.extension
|
||||
|
||||
import com.baeldung.metaprogramming.Employee
|
||||
|
||||
class StaticEmployeeExtension {
|
||||
|
||||
static Employee getDefaultObj(Employee self) {
|
||||
return new Employee(firstName: "firstName", lastName: "lastName", age: 20)
|
||||
}
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
moduleName=core-groovy-2
|
||||
moduleVersion=1.0-SNAPSHOT
|
||||
extensionClasses=com.baeldung.metaprogramming.extension.BasicExtensions
|
||||
staticExtensionClasses=com.baeldung.metaprogramming.extension.StaticEmployeeExtension
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
package com.baeldung.metaprogramming
|
||||
|
||||
import groovy.time.TimeCategory
|
||||
|
||||
class MetaprogrammingUnitTest extends GroovyTestCase {
|
||||
|
||||
Employee emp = new Employee(firstName: "Norman", lastName: "Lewis")
|
||||
|
||||
void testPropertyMissing() {
|
||||
assert emp.address == "property 'address' is not available"
|
||||
}
|
||||
|
||||
void testMethodMissing() {
|
||||
Employee emp = new Employee()
|
||||
try {
|
||||
emp.getFullName()
|
||||
} catch(MissingMethodException e) {
|
||||
println "method is not defined"
|
||||
}
|
||||
assert emp.getFullName() == "method 'getFullName' is not defined"
|
||||
}
|
||||
|
||||
void testMetaClassProperty() {
|
||||
Employee.metaClass.address = ""
|
||||
emp = new Employee(firstName: "Norman", lastName: "Lewis", address: "US")
|
||||
assert emp.address == "US"
|
||||
}
|
||||
|
||||
void testMetaClassMethod() {
|
||||
emp.metaClass.getFullName = {
|
||||
"$lastName, $firstName"
|
||||
}
|
||||
assert emp.getFullName() == "Lewis, Norman"
|
||||
}
|
||||
|
||||
void testMetaClassConstructor() {
|
||||
try {
|
||||
Employee emp = new Employee("Norman")
|
||||
} catch(GroovyRuntimeException e) {
|
||||
assert e.message == "Could not find matching constructor for: com.baeldung.metaprogramming.Employee(String)"
|
||||
}
|
||||
|
||||
Employee.metaClass.constructor = { String firstName ->
|
||||
new Employee(firstName: firstName)
|
||||
}
|
||||
|
||||
Employee norman = new Employee("Norman")
|
||||
assert norman.firstName == "Norman"
|
||||
assert norman.lastName == null
|
||||
}
|
||||
|
||||
void testJavaMetaClass() {
|
||||
String.metaClass.capitalize = { String str ->
|
||||
str.substring(0, 1).toUpperCase() + str.substring(1);
|
||||
}
|
||||
assert "norman".capitalize() == "Norman"
|
||||
}
|
||||
|
||||
void testEmployeeExtension() {
|
||||
Employee emp = new Employee(age: 28)
|
||||
assert emp.getYearOfBirth() == 1991
|
||||
}
|
||||
|
||||
void testJavaClassesExtensions() {
|
||||
5.printCounter()
|
||||
|
||||
assert 40l.square() == 1600l
|
||||
|
||||
assert (2.98).cube() == 26.463592
|
||||
}
|
||||
|
||||
void testStaticEmployeeExtension() {
|
||||
assert Employee.getDefaultObj().firstName == "firstName"
|
||||
assert Employee.getDefaultObj().lastName == "lastName"
|
||||
assert Employee.getDefaultObj().age == 20
|
||||
}
|
||||
|
||||
void testToStringAnnotation() {
|
||||
Employee employee = new Employee()
|
||||
employee.id = 1
|
||||
employee.firstName = "norman"
|
||||
employee.lastName = "lewis"
|
||||
employee.age = 28
|
||||
|
||||
assert employee.toString() == "Employee(norman, lewis, 28)"
|
||||
}
|
||||
|
||||
void testTupleConstructorAnnotation() {
|
||||
Employee norman = new Employee(1, "norman", "lewis", 28)
|
||||
assert norman.toString() == "Employee(norman, lewis, 28)"
|
||||
|
||||
Employee snape = new Employee(2, "snape")
|
||||
assert snape.toString() == "Employee(snape, null, 0)"
|
||||
|
||||
}
|
||||
|
||||
void testEqualsAndHashCodeAnnotation() {
|
||||
Employee norman = new Employee(1, "norman", "lewis", 28)
|
||||
Employee normanCopy = new Employee(1, "norman", "lewis", 28)
|
||||
assert norman.equals(normanCopy)
|
||||
assert norman.hashCode() == normanCopy.hashCode()
|
||||
}
|
||||
|
||||
void testAutoCloneAnnotation() {
|
||||
try {
|
||||
Employee norman = new Employee(1, "norman", "lewis", 28)
|
||||
def normanCopy = norman.clone()
|
||||
assert norman == normanCopy
|
||||
} catch(CloneNotSupportedException e) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
void testLoggingAnnotation() {
|
||||
Employee employee = new Employee(1, "Norman", "Lewis", 28)
|
||||
employee.logEmp()
|
||||
}
|
||||
}
|
||||
@@ -7,3 +7,4 @@
|
||||
- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
|
||||
- [Run JAR Application With Command Line Arguments](https://www.baeldung.com/java-run-jar-with-arguments)
|
||||
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
|
||||
- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
|
||||
|
||||
@@ -4,14 +4,10 @@
|
||||
|
||||
### Relevant Articles:
|
||||
- [Guide to Java 8’s Collectors](http://www.baeldung.com/java-8-collectors)
|
||||
- [Functional Interfaces in Java 8](http://www.baeldung.com/java-8-functional-interfaces)
|
||||
- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
|
||||
- [New Features in Java 8](http://www.baeldung.com/java-8-new-features)
|
||||
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
|
||||
- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
|
||||
- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
|
||||
- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern)
|
||||
- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
|
||||
- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing)
|
||||
- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional)
|
||||
- [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java)
|
||||
@@ -38,6 +34,5 @@
|
||||
- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
|
||||
- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
|
||||
- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
|
||||
- [Method References in Java](https://www.baeldung.com/java-method-references)
|
||||
- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
|
||||
- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
|
||||
- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
|
||||
- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
|
||||
- [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
|
||||
- [Multi-Dimensional Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
|
||||
- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
|
||||
- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide)
|
||||
- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
|
||||
@@ -16,3 +16,4 @@
|
||||
- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
|
||||
- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
|
||||
- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array)
|
||||
- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
### Relevant Articles
|
||||
|
||||
- [Design Strategies for Decoupling Java Modules](https://www.baeldung.com/java-modules-decoupling-design-strategies)
|
||||
@@ -1,3 +1,8 @@
|
||||
## Relevant articles:
|
||||
|
||||
- [Why Do Local Variables Used in Lambdas Have to Be Final or Effectively Final?](https://www.baeldung.com/java-lambda-effectively-final-local-variables)
|
||||
- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
|
||||
- [Functional Interfaces in Java 8](http://www.baeldung.com/java-8-functional-interfaces)
|
||||
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
|
||||
- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
|
||||
- [Method References in Java](https://www.baeldung.com/java-method-references)
|
||||
|
||||
@@ -15,5 +15,11 @@
|
||||
<relativePath>../../parent-java</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user