Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
0c58a8ff8a
26
.gitignore
vendored
26
.gitignore
vendored
@ -34,8 +34,6 @@ spring-security-openid/src/main/resources/application.properties
|
|||||||
|
|
||||||
spring-all/*.log
|
spring-all/*.log
|
||||||
|
|
||||||
*.jar
|
|
||||||
|
|
||||||
SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties
|
SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties
|
||||||
|
|
||||||
spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties
|
spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties
|
||||||
@ -44,3 +42,27 @@ spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties
|
|||||||
*.springBeans
|
*.springBeans
|
||||||
|
|
||||||
20171220-JMeter.csv
|
20171220-JMeter.csv
|
||||||
|
|
||||||
|
.factorypath
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
xml/src/test/resources/example_dom4j_new.xml
|
||||||
|
xml/src/test/resources/example_dom4j_updated.xml
|
||||||
|
xml/src/test/resources/example_jaxb_new.xml
|
||||||
|
core-java-io/hard_link.txt
|
||||||
|
core-java-io/target_link.txt
|
||||||
|
core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF
|
||||||
|
ethereum/logs/
|
||||||
|
jmeter/src/main/resources/*-JMeter.csv
|
||||||
|
|
||||||
|
**/node_modules/
|
||||||
|
**/dist
|
||||||
|
**/tmp
|
||||||
|
**/out-tsc
|
||||||
|
**/nbproject/
|
||||||
|
**/nb-configuration.xml
|
||||||
|
core-scala/.cache-main
|
||||||
|
core-scala/.cache-tests
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
|||||||
[submodule "testgitrepo"]
|
|
||||||
path = testgitrepo
|
|
||||||
url = /home/prd/Development/projects/idea/tutorials/spring-boot/src/main/resources/testgitrepo/
|
|
@ -4,7 +4,7 @@ before_install:
|
|||||||
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
|
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
|
||||||
|
|
||||||
install: skip
|
install: skip
|
||||||
script: travis_wait 60 mvn -q test -fae
|
script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
|
|
||||||
|
78
JGit/pom.xml
78
JGit/pom.xml
@ -1,51 +1,53 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>JGitSnippets</artifactId>
|
<artifactId>JGit</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<url>http://maven.apache.org</url>
|
<url>http://maven.apache.org</url>
|
||||||
|
<name>JGit</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<repositories>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<repository>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<id>jgit-repository</id>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<url>https://repo.eclipse.org/content/groups/releases/</url>
|
||||||
</properties>
|
</repository>
|
||||||
<repositories>
|
</repositories>
|
||||||
<repository>
|
|
||||||
<id>jgit-repository</id>
|
<!-- Core Library -->
|
||||||
<url>https://repo.eclipse.org/content/groups/releases/</url>
|
<dependencies>
|
||||||
</repository>
|
<dependency>
|
||||||
</repositories>
|
<groupId>org.eclipse.jgit</groupId>
|
||||||
|
<artifactId>org.eclipse.jgit</artifactId>
|
||||||
|
<version>${org.eclipse.jgit.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jgit</groupId>
|
||||||
|
<artifactId>org.eclipse.jgit.archive</artifactId>
|
||||||
|
<version>${org.eclipse.jgit.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>${commons-io.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-simple</artifactId>
|
||||||
|
<version>${org.slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<org.eclipse.jgit.version>4.5.0.201609210915-r</org.eclipse.jgit.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<!-- Core Library -->
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.eclipse.jgit</groupId>
|
|
||||||
<artifactId>org.eclipse.jgit</artifactId>
|
|
||||||
<version>4.5.0.201609210915-r</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.eclipse.jgit</groupId>
|
|
||||||
<artifactId>org.eclipse.jgit.archive</artifactId>
|
|
||||||
<version>4.5.0.201609210915-r</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-io</groupId>
|
|
||||||
<artifactId>commons-io</artifactId>
|
|
||||||
<version>2.5</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-simple</artifactId>
|
|
||||||
<version>1.7.21</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
</project>
|
@ -28,14 +28,14 @@ public class Log {
|
|||||||
System.out.println("Had " + count + " commits overall on current branch");
|
System.out.println("Had " + count + " commits overall on current branch");
|
||||||
|
|
||||||
logs = git.log()
|
logs = git.log()
|
||||||
.add(repository.resolve("remotes/origin/testbranch"))
|
.add(repository.resolve(git.getRepository().getFullBranch()))
|
||||||
.call();
|
.call();
|
||||||
count = 0;
|
count = 0;
|
||||||
for (RevCommit rev : logs) {
|
for (RevCommit rev : logs) {
|
||||||
System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
|
System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
System.out.println("Had " + count + " commits overall on test-branch");
|
System.out.println("Had " + count + " commits overall on "+git.getRepository().getFullBranch());
|
||||||
|
|
||||||
logs = git.log()
|
logs = git.log()
|
||||||
.all()
|
.all()
|
||||||
|
13
JGit/src/main/resources/logback.xml
Normal file
13
JGit/src/main/resources/logback.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
@ -1,3 +1,5 @@
|
|||||||
|
package com.baeldung.jgit;
|
||||||
|
|
||||||
import com.baeldung.jgit.helper.Helper;
|
import com.baeldung.jgit.helper.Helper;
|
||||||
import org.eclipse.jgit.lib.ObjectLoader;
|
import org.eclipse.jgit.lib.ObjectLoader;
|
||||||
import org.eclipse.jgit.lib.ObjectReader;
|
import org.eclipse.jgit.lib.ObjectReader;
|
||||||
|
37
README.md
37
README.md
@ -2,30 +2,37 @@
|
|||||||
The "REST with Spring" Classes
|
The "REST with Spring" Classes
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
After 5 months of work, here's the Master Class of REST With Spring: <br/>
|
Here's the Master Class of REST With Spring (along with the newly announced Boot 2 material): <br/>
|
||||||
**[>> THE REST WITH SPRING MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
|
**[>> THE REST WITH SPRING - MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
|
||||||
|
|
||||||
And here's the Master Class of Learn Spring Security: <br/>
|
And here's the Master Class of Learn Spring Security: <br/>
|
||||||
**[>> LEARN SPRING SECURITY MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
|
**[>> LEARN SPRING SECURITY - MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Spring Tutorials
|
Java and Spring Tutorials
|
||||||
================
|
================
|
||||||
|
|
||||||
This project is **a collection of small and focused tutorials** each covering a single and well defined area of development.
|
This project is **a collection of small and focused tutorials** - each covering a single and well defined area of development in the Java ecosystem.
|
||||||
Most of the tutorial projects are focused on the `Spring Framework` (and `Spring Security`).
|
A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Security.
|
||||||
In additional to Spring, the following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`.
|
In additional to Spring, the following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`.
|
||||||
|
|
||||||
|
|
||||||
Working with the code in Eclipse
|
Building the project
|
||||||
================================
|
====================
|
||||||
Any IDE can be used to work with the projects, but if you're using Eclipse, consider the following.
|
To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false`
|
||||||
|
|
||||||
- import the included **formatter** in Eclipse:
|
|
||||||
`https://github.com/eugenp/tutorials/tree/master/eclipse`
|
Building a single module
|
||||||
|
====================
|
||||||
|
To build a specific module run the command: `mvn clean install -Dgib.enabled=false` in the module directory
|
||||||
|
|
||||||
|
|
||||||
|
Running a Spring Boot module
|
||||||
|
====================
|
||||||
|
To run a Spring Boot module run the command: `mvn spring-boot:run -Dgib.enabled=false` in the module directory
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CI - Jenkins
|
|
||||||
================================
|
|
||||||
This tutorials project is being built **[>> HERE](https://rest-security.ci.cloudbees.com/job/tutorials-unit/)**
|
|
||||||
|
@ -1,52 +1,26 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.mabsisa</groupId>
|
<artifactId>Twitter4J</artifactId>
|
||||||
<artifactId>Twitter4J</artifactId>
|
<packaging>jar</packaging>
|
||||||
<packaging>jar</packaging>
|
<name>Twitter4J</name>
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
<name>Twitter4J</name>
|
|
||||||
<url>http://maven.apache.org</url>
|
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<java.version>1.8</java.version>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.twitter4j</groupId>
|
<groupId>org.twitter4j</groupId>
|
||||||
<artifactId>twitter4j-stream</artifactId>
|
<artifactId>twitter4j-stream</artifactId>
|
||||||
<version>4.0.6</version>
|
<version>${twitter4j-stream.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<properties>
|
||||||
<finalName>${project.artifactId}</finalName>
|
<twitter4j-stream.version>4.0.6</twitter4j-stream.version>
|
||||||
<resources>
|
</properties>
|
||||||
<resource>
|
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<version>${maven-surefire-plugin.version}</version>
|
|
||||||
<configuration>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/ApplicationTest.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
13
Twitter4J/src/main/resources/logback.xml
Normal file
13
Twitter4J/src/main/resources/logback.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
@ -1,129 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>com.baeldung</groupId>
|
|
||||||
<artifactId>activejdbc</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
<name>activejdbc</name>
|
|
||||||
<url>http://maven.apache.org</url>
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<activejdbc.version>1.4.13</activejdbc.version>
|
|
||||||
<environments>development.test,development</environments>
|
|
||||||
</properties>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.6.0</version>
|
|
||||||
<configuration>
|
|
||||||
<source>1.8</source>
|
|
||||||
<target>1.8</target>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.javalite</groupId>
|
|
||||||
<artifactId>activejdbc-instrumentation</artifactId>
|
|
||||||
<version>${activejdbc.version}</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>process-classes</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>instrument</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.javalite</groupId>
|
|
||||||
<artifactId>db-migrator-maven-plugin</artifactId>
|
|
||||||
<version>${activejdbc.version}</version>
|
|
||||||
<configuration>
|
|
||||||
<configFile>${project.basedir}/src/main/resources/database.properties</configFile>
|
|
||||||
<environments>${environments}</environments>
|
|
||||||
</configuration>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>mysql</groupId>
|
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
|
||||||
<version>5.1.34</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<version>2.18.1</version>
|
|
||||||
<configuration>
|
|
||||||
<reportFormat>brief</reportFormat>
|
|
||||||
<trimStackTrace>true</trimStackTrace>
|
|
||||||
<useFile>false</useFile>
|
|
||||||
<includes>
|
|
||||||
<include>**/*Spec*.java</include>
|
|
||||||
<include>**/*Test*.java</include>
|
|
||||||
</includes>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/helpers/*</exclude>
|
|
||||||
<exclude>**/*$*</exclude>
|
|
||||||
</excludes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>4.12</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.javalite</groupId>
|
|
||||||
<artifactId>activejdbc</artifactId>
|
|
||||||
<version>${activejdbc.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>opensymphony</groupId>
|
|
||||||
<artifactId>oscache</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>mysql</groupId>
|
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
|
||||||
<version>5.1.34</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-simple</artifactId>
|
|
||||||
<version>1.7.9</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>snapshots1</id>
|
|
||||||
<name>JavaLite Snapshots1</name>
|
|
||||||
<url>http://repo.javalite.io/</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<updatePolicy>always</updatePolicy>
|
|
||||||
<checksumPolicy>warn</checksumPolicy>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
<pluginRepositories>
|
|
||||||
<pluginRepository>
|
|
||||||
<id>snapshots2</id>
|
|
||||||
<name>JavaLite Snapshots2</name>
|
|
||||||
<url>http://repo.javalite.io/</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<updatePolicy>always</updatePolicy>
|
|
||||||
<checksumPolicy>warn</checksumPolicy>
|
|
||||||
</snapshots>
|
|
||||||
</pluginRepository>
|
|
||||||
</pluginRepositories>
|
|
||||||
</project>
|
|
@ -1,19 +0,0 @@
|
|||||||
package com.baeldung.model;
|
|
||||||
|
|
||||||
|
|
||||||
import org.javalite.activejdbc.Model;
|
|
||||||
|
|
||||||
public class Employee extends Model {
|
|
||||||
|
|
||||||
public Employee(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Employee(String firstName, String lastName, String gender, String createdBy) {
|
|
||||||
set("first_name1",firstName);
|
|
||||||
set("last_name",lastName);
|
|
||||||
set("gender",gender);
|
|
||||||
set("created_by",createdBy);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
package com.baeldung;
|
|
||||||
|
|
||||||
import com.baeldung.model.Employee;
|
|
||||||
import com.baeldung.model.Role;
|
|
||||||
import org.javalite.activejdbc.test.DBSpec;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ActiveJDBCAppTest extends DBSpec
|
|
||||||
{
|
|
||||||
@Test
|
|
||||||
public void ifEmployeeCreated_thenIsValid() {
|
|
||||||
Employee employee = new Employee("B", "N", "M", "BN");
|
|
||||||
the(employee).shouldBe("valid");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void ifEmployeeCreatedWithRoles_thenShouldPersist() {
|
|
||||||
Employee employee = new Employee("B", "N", "M", "BN");
|
|
||||||
employee.saveIt();
|
|
||||||
employee.add(new Role("Java Developer","BN"));
|
|
||||||
employee.add(new Role("Lead Java Developer","BN"));
|
|
||||||
a(Role.count()).shouldBeEqual(2);
|
|
||||||
List<Role> roles = employee.getAll(Role.class).orderBy("created_at");
|
|
||||||
the(roles.get(0).getRoleName()).shouldBeEqual("Java Developer");
|
|
||||||
the(roles.get(1).getRoleName()).shouldBeEqual("Lead Java Developer");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void ifEmployeeCreatedWithRoles_whenNameUpdated_thenShouldShowNewName() {
|
|
||||||
Employee employee = new Employee("Binesh", "N", "M", "BN");
|
|
||||||
employee.saveIt();
|
|
||||||
employee.add(new Role("Java Developer","BN"));
|
|
||||||
employee.add(new Role("Lead Java Developer","BN"));
|
|
||||||
employee = Employee.findFirst("first_name = ?", "Binesh");
|
|
||||||
employee.set("last_name","Narayanan").saveIt();
|
|
||||||
Employee updated = Employee.findFirst("first_name = ?", "Binesh");
|
|
||||||
the(updated.getLastName()).shouldBeEqual("Narayanan");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void ifEmployeeCreatedWithRoles_whenDeleted_thenShouldNotBeFound() {
|
|
||||||
Employee employee = new Employee("Binesh", "N", "M", "BN");
|
|
||||||
employee.saveIt();
|
|
||||||
employee.add(new Role("Java Developer","BN"));
|
|
||||||
employee.delete();
|
|
||||||
employee = Employee.findFirst("first_name = ?", "Binesh");
|
|
||||||
the(employee).shouldBeNull();
|
|
||||||
}
|
|
||||||
}
|
|
3
akka-http/README.md
Normal file
3
akka-http/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## Relevant articles:
|
||||||
|
|
||||||
|
- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http)
|
48
akka-http/pom.xml
Normal file
48
akka-http/pom.xml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>akka-http</artifactId>
|
||||||
|
<name>akka-http</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-http_2.12</artifactId>
|
||||||
|
<version>${akka.http.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-stream_2.12</artifactId>
|
||||||
|
<version>2.5.11</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-http-jackson_2.12</artifactId>
|
||||||
|
<version>${akka.http.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-http-testkit_2.12</artifactId>
|
||||||
|
<version>${akka.http.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<akka.http.version>10.0.11</akka.http.version>
|
||||||
|
<akka.stream.version>2.5.11</akka.stream.version>
|
||||||
|
</properties>
|
||||||
|
</project>
|
26
akka-http/src/main/java/com/baeldung/akkahttp/User.java
Normal file
26
akka-http/src/main/java/com/baeldung/akkahttp/User.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
public class User {
|
||||||
|
|
||||||
|
private final Long id;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public User() {
|
||||||
|
this.name = "";
|
||||||
|
this.id = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(Long id, String name) {
|
||||||
|
this.name = name;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
41
akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java
Normal file
41
akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
import akka.actor.AbstractActor;
|
||||||
|
import akka.actor.Props;
|
||||||
|
import akka.japi.pf.FI;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.ActionPerformed;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.CreateUserMessage;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.GetUserMessage;
|
||||||
|
|
||||||
|
|
||||||
|
class UserActor extends AbstractActor {
|
||||||
|
|
||||||
|
private UserService userService = new UserService();
|
||||||
|
|
||||||
|
static Props props() {
|
||||||
|
return Props.create(UserActor.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Receive createReceive() {
|
||||||
|
return receiveBuilder()
|
||||||
|
.match(CreateUserMessage.class, handleCreateUser())
|
||||||
|
.match(GetUserMessage.class, handleGetUser())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private FI.UnitApply<CreateUserMessage> handleCreateUser() {
|
||||||
|
return createUserMessageMessage -> {
|
||||||
|
userService.createUser(createUserMessageMessage.getUser());
|
||||||
|
sender().tell(new ActionPerformed(String.format("User %s created.", createUserMessageMessage.getUser()
|
||||||
|
.getName())), getSelf());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private FI.UnitApply<GetUserMessage> handleGetUser() {
|
||||||
|
return getUserMessageMessage -> {
|
||||||
|
sender().tell(userService.getUser(getUserMessageMessage.getUserId()), getSelf());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public interface UserMessages {
|
||||||
|
|
||||||
|
class ActionPerformed implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
public ActionPerformed(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CreateUserMessage implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private final User user;
|
||||||
|
|
||||||
|
public CreateUserMessage(User user) {
|
||||||
|
this.user = user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User getUser() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetUserMessage implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private final Long userId;
|
||||||
|
|
||||||
|
public GetUserMessage(Long userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.CompletionStage;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import akka.actor.ActorRef;
|
||||||
|
import akka.actor.ActorSystem;
|
||||||
|
import akka.http.javadsl.marshallers.jackson.Jackson;
|
||||||
|
import akka.http.javadsl.model.StatusCodes;
|
||||||
|
import akka.http.javadsl.server.HttpApp;
|
||||||
|
import akka.http.javadsl.server.Route;
|
||||||
|
import akka.pattern.PatternsCS;
|
||||||
|
import akka.util.Timeout;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.ActionPerformed;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.CreateUserMessage;
|
||||||
|
import com.baeldung.akkahttp.UserMessages.GetUserMessage;
|
||||||
|
import scala.concurrent.duration.Duration;
|
||||||
|
import static akka.http.javadsl.server.PathMatchers.*;
|
||||||
|
|
||||||
|
class UserServer extends HttpApp {
|
||||||
|
|
||||||
|
private final ActorRef userActor;
|
||||||
|
|
||||||
|
Timeout timeout = new Timeout(Duration.create(5, TimeUnit.SECONDS));
|
||||||
|
|
||||||
|
UserServer(ActorRef userActor) {
|
||||||
|
this.userActor = userActor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Route routes() {
|
||||||
|
return path("users", this::postUser)
|
||||||
|
.orElse(path(segment("users").slash(longSegment()), id ->
|
||||||
|
route(getUser(id))));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Route getUser(Long id) {
|
||||||
|
return get(() -> {
|
||||||
|
CompletionStage<Optional<User>> user = PatternsCS.ask(userActor, new GetUserMessage(id), timeout)
|
||||||
|
.thenApply(obj -> (Optional<User>) obj);
|
||||||
|
|
||||||
|
return onSuccess(() -> user, performed -> {
|
||||||
|
if (performed.isPresent())
|
||||||
|
return complete(StatusCodes.OK, performed.get(), Jackson.marshaller());
|
||||||
|
else
|
||||||
|
return complete(StatusCodes.NOT_FOUND);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Route postUser() {
|
||||||
|
return route(post(() -> entity(Jackson.unmarshaller(User.class), user -> {
|
||||||
|
CompletionStage<ActionPerformed> userCreated = PatternsCS.ask(userActor, new CreateUserMessage(user), timeout)
|
||||||
|
.thenApply(obj -> (ActionPerformed) obj);
|
||||||
|
|
||||||
|
return onSuccess(() -> userCreated, performed -> {
|
||||||
|
return complete(StatusCodes.CREATED, performed, Jackson.marshaller());
|
||||||
|
});
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
ActorSystem system = ActorSystem.create("userServer");
|
||||||
|
ActorRef userActor = system.actorOf(UserActor.props(), "userActor");
|
||||||
|
UserServer server = new UserServer(userActor);
|
||||||
|
server.startServer("localhost", 8080, system);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class UserService {
|
||||||
|
|
||||||
|
private final static List<User> users = new ArrayList<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
users.add(new User(1l, "Alice"));
|
||||||
|
users.add(new User(2l, "Bob"));
|
||||||
|
users.add(new User(3l, "Chris"));
|
||||||
|
users.add(new User(4l, "Dick"));
|
||||||
|
users.add(new User(5l, "Eve"));
|
||||||
|
users.add(new User(6l, "Finn"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<User> getUser(Long id) {
|
||||||
|
return users.stream()
|
||||||
|
.filter(user -> user.getId()
|
||||||
|
.equals(id))
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createUser(User user) {
|
||||||
|
users.add(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<User> getUsers(){
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.baeldung.akkahttp;
|
||||||
|
|
||||||
|
import akka.actor.ActorRef;
|
||||||
|
import akka.actor.ActorSystem;
|
||||||
|
import akka.http.javadsl.model.ContentTypes;
|
||||||
|
import akka.http.javadsl.model.HttpEntities;
|
||||||
|
import akka.http.javadsl.model.HttpRequest;
|
||||||
|
import akka.http.javadsl.testkit.JUnitRouteTest;
|
||||||
|
import akka.http.javadsl.testkit.TestRoute;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class UserServerUnitTest extends JUnitRouteTest {
|
||||||
|
|
||||||
|
ActorSystem system = ActorSystem.create("helloAkkaHttpServer");
|
||||||
|
|
||||||
|
ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor");
|
||||||
|
|
||||||
|
TestRoute appRoute = testRoute(new UserServer(userActorRef).routes());
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenRequest_thenActorResponds() {
|
||||||
|
|
||||||
|
appRoute.run(HttpRequest.GET("/users/1"))
|
||||||
|
.assertEntity(alice())
|
||||||
|
.assertStatusCode(200);
|
||||||
|
|
||||||
|
appRoute.run(HttpRequest.GET("/users/42"))
|
||||||
|
.assertStatusCode(404);
|
||||||
|
|
||||||
|
appRoute.run(HttpRequest.DELETE("/users/1"))
|
||||||
|
.assertStatusCode(200);
|
||||||
|
|
||||||
|
appRoute.run(HttpRequest.DELETE("/users/42"))
|
||||||
|
.assertStatusCode(200);
|
||||||
|
|
||||||
|
appRoute.run(HttpRequest.POST("/users")
|
||||||
|
.withEntity(HttpEntities.create(ContentTypes.APPLICATION_JSON, zaphod())))
|
||||||
|
.assertStatusCode(201);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String alice() {
|
||||||
|
return "{\"id\":1,\"name\":\"Alice\"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String zaphod() {
|
||||||
|
return "{\"id\":42,\"name\":\"Zaphod\"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,15 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>akka-streams</artifactId>
|
||||||
|
<name>akka-streams</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>akka-streams</artifactId>
|
|
||||||
<name>akka-streams</name>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -23,6 +23,7 @@
|
|||||||
<version>${akkastreams.version}</version>
|
<version>${akkastreams.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<akkastreams.version>2.5.2</akkastreams.version>
|
<akkastreams.version>2.5.2</akkastreams.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
13
akka-streams/src/main/resources/logback.xml
Normal file
13
akka-streams/src/main/resources/logback.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
4
algorithms-genetic/.gitignore
vendored
Normal file
4
algorithms-genetic/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
.settings/
|
||||||
|
.classpath
|
||||||
|
.project
|
6
algorithms-genetic/README.md
Normal file
6
algorithms-genetic/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
## Relevant articles:
|
||||||
|
|
||||||
|
- [Introduction to Jenetics Library](http://www.baeldung.com/jenetics)
|
||||||
|
- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
|
||||||
|
- [Design a Genetic Algorithm in Java](https://www.baeldung.com/java-genetic-algorithm)
|
||||||
|
- [The Traveling Salesman Problem in Java](https://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
|
65
algorithms-genetic/pom.xml
Normal file
65
algorithms-genetic/pom.xml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>algorithms-genetic</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>algorithms-genetic</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-math3</artifactId>
|
||||||
|
<version>${commons-math3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>${commons-codec.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jenetics</groupId>
|
||||||
|
<artifactId>jenetics</artifactId>
|
||||||
|
<version>${io.jenetics.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${org.assertj.core.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>${exec-maven-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<lombok.version>1.16.12</lombok.version>
|
||||||
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
|
<io.jenetics.version>3.7.0</io.jenetics.version>
|
||||||
|
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||||
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.ga.annealing.SimulatedAnnealing;
|
||||||
|
import com.baeldung.algorithms.ga.ant_colony.AntColonyOptimization;
|
||||||
|
import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm;
|
||||||
|
|
||||||
|
public class RunAlgorithm {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
|
||||||
|
Scanner in = new Scanner(System.in);
|
||||||
|
System.out.println("Run algorithm:");
|
||||||
|
System.out.println("1 - Simulated Annealing");
|
||||||
|
System.out.println("2 - Simple Genetic Algorithm");
|
||||||
|
System.out.println("3 - Ant Colony");
|
||||||
|
int decision = in.nextInt();
|
||||||
|
switch (decision) {
|
||||||
|
case 1:
|
||||||
|
System.out.println(
|
||||||
|
"Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SimpleGeneticAlgorithm ga = new SimpleGeneticAlgorithm();
|
||||||
|
ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
AntColonyOptimization antColony = new AntColonyOptimization(21);
|
||||||
|
antColony.startAntOptimization();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.println("Unknown option");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
algorithms-genetic/src/main/resources/logback.xml
Normal file
13
algorithms-genetic/src/main/resources/logback.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
@ -1,4 +1,4 @@
|
|||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
@ -1,4 +1,4 @@
|
|||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
@ -1,4 +1,4 @@
|
|||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
4
algorithms-miscellaneous-1/.gitignore
vendored
Normal file
4
algorithms-miscellaneous-1/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
.settings/
|
||||||
|
.classpath
|
||||||
|
.project
|
17
algorithms-miscellaneous-1/README.md
Normal file
17
algorithms-miscellaneous-1/README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
## Relevant articles:
|
||||||
|
|
||||||
|
- [Validating Input With Finite Automata in Java](http://www.baeldung.com/java-finite-automata)
|
||||||
|
- [Example of Hill Climbing Algorithm](http://www.baeldung.com/java-hill-climbing-algorithm)
|
||||||
|
- [Monte Carlo Tree Search for Tic-Tac-Toe Game](http://www.baeldung.com/java-monte-carlo-tree-search)
|
||||||
|
- [Binary Search Algorithm in Java](http://www.baeldung.com/java-binary-search)
|
||||||
|
- [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm)
|
||||||
|
- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance)
|
||||||
|
- [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element)
|
||||||
|
- [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm)
|
||||||
|
- [String Search Algorithms for Large Texts](http://www.baeldung.com/java-full-text-search-algorithms)
|
||||||
|
- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
|
||||||
|
- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element)
|
||||||
|
- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial)
|
||||||
|
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
|
||||||
|
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
|
||||||
|
- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
|
84
algorithms-miscellaneous-1/pom.xml
Normal file
84
algorithms-miscellaneous-1/pom.xml
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>algorithms-miscellaneous-1</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>algorithms-miscellaneous-1</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-math3</artifactId>
|
||||||
|
<version>${commons-math3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>${commons-codec.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${org.assertj.core.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>${exec-maven-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<reporting>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
|
<version>2.7</version>
|
||||||
|
<configuration>
|
||||||
|
<instrumentation>
|
||||||
|
<ignores>
|
||||||
|
<ignore>com/baeldung/algorithms/dijkstra/*</ignore>
|
||||||
|
</ignores>
|
||||||
|
<excludes>
|
||||||
|
<exclude>com/baeldung/algorithms/dijkstra/*</exclude>
|
||||||
|
</excludes>
|
||||||
|
</instrumentation>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</reporting>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<lombok.version>1.16.12</lombok.version>
|
||||||
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
|
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||||
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
|
<guava.version>25.1-jre</guava.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,46 @@
|
|||||||
|
package com.baeldung.algorithms.enumstatemachine;
|
||||||
|
|
||||||
|
public enum LeaveRequestState {
|
||||||
|
|
||||||
|
Submitted {
|
||||||
|
@Override
|
||||||
|
public LeaveRequestState nextState() {
|
||||||
|
System.out.println("Starting the Leave Request and sending to Team Leader for approval.");
|
||||||
|
return Escalated;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String responsiblePerson() {
|
||||||
|
return "Employee";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Escalated {
|
||||||
|
@Override
|
||||||
|
public LeaveRequestState nextState() {
|
||||||
|
System.out.println("Reviewing the Leave Request and escalating to Department Manager.");
|
||||||
|
return Approved;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String responsiblePerson() {
|
||||||
|
return "Team Leader";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Approved {
|
||||||
|
@Override
|
||||||
|
public LeaveRequestState nextState() {
|
||||||
|
System.out.println("Approving the Leave Request.");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String responsiblePerson() {
|
||||||
|
return "Department Manager";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public abstract String responsiblePerson();
|
||||||
|
|
||||||
|
public abstract LeaveRequestState nextState();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package com.baeldung.algorithms.factorial;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.stream.LongStream;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.util.CombinatoricsUtils;
|
||||||
|
|
||||||
|
import com.google.common.math.BigIntegerMath;
|
||||||
|
|
||||||
|
public class Factorial {
|
||||||
|
|
||||||
|
public long factorialUsingForLoop(int n) {
|
||||||
|
long fact = 1;
|
||||||
|
for (int i = 2; i <= n; i++) {
|
||||||
|
fact = fact * i;
|
||||||
|
}
|
||||||
|
return fact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long factorialUsingStreams(int n) {
|
||||||
|
return LongStream.rangeClosed(1, n)
|
||||||
|
.reduce(1, (long x, long y) -> x * y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long factorialUsingRecursion(int n) {
|
||||||
|
if (n <= 2) {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
return n * factorialUsingRecursion(n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long[] factorials = new Long[20];
|
||||||
|
|
||||||
|
public long factorialUsingMemoize(int n) {
|
||||||
|
|
||||||
|
if (factorials[n] != null) {
|
||||||
|
return factorials[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n <= 2) {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
long nthValue = n * factorialUsingMemoize(n - 1);
|
||||||
|
factorials[n] = nthValue;
|
||||||
|
return nthValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger factorialHavingLargeResult(int n) {
|
||||||
|
BigInteger result = BigInteger.ONE;
|
||||||
|
for (int i = 2; i <= n; i++)
|
||||||
|
result = result.multiply(BigInteger.valueOf(i));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long factorialUsingApacheCommons(int n) {
|
||||||
|
return CombinatoricsUtils.factorial(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger factorialUsingGuava(int n) {
|
||||||
|
return BigIntegerMath.factorial(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -98,7 +98,7 @@ public class FindKthLargest {
|
|||||||
|
|
||||||
private int randomPartition(Integer arr[], int left, int right) {
|
private int randomPartition(Integer arr[], int left, int right) {
|
||||||
int n = right - left + 1;
|
int n = right - left + 1;
|
||||||
int pivot = (int) (Math.random()) % n;
|
int pivot = (int) (Math.random() * n);
|
||||||
swap(arr, left + pivot, right);
|
swap(arr, left + pivot, right);
|
||||||
return partition(arr, left, right);
|
return partition(arr, left, right);
|
||||||
}
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.algorithms.linesintersection;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class LinesIntersectionService {
|
||||||
|
|
||||||
|
public Optional<Point> calculateIntersectionPoint(double m1, double b1, double m2, double b2) {
|
||||||
|
|
||||||
|
if (m1 == m2) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
double x = (b2 - b1) / (m1 - m2);
|
||||||
|
double y = m1 * x + b1;
|
||||||
|
|
||||||
|
Point point = new Point();
|
||||||
|
point.setLocation(x, y);
|
||||||
|
return Optional.of(point);
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ public class MonteCarloTreeSearch {
|
|||||||
|
|
||||||
private static final int WIN_SCORE = 10;
|
private static final int WIN_SCORE = 10;
|
||||||
private int level;
|
private int level;
|
||||||
private int oponent;
|
private int opponent;
|
||||||
|
|
||||||
public MonteCarloTreeSearch() {
|
public MonteCarloTreeSearch() {
|
||||||
this.level = 3;
|
this.level = 3;
|
||||||
@ -32,11 +32,11 @@ public class MonteCarloTreeSearch {
|
|||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
long end = start + 60 * getMillisForCurrentLevel();
|
long end = start + 60 * getMillisForCurrentLevel();
|
||||||
|
|
||||||
oponent = 3 - playerNo;
|
opponent = 3 - playerNo;
|
||||||
Tree tree = new Tree();
|
Tree tree = new Tree();
|
||||||
Node rootNode = tree.getRoot();
|
Node rootNode = tree.getRoot();
|
||||||
rootNode.getState().setBoard(board);
|
rootNode.getState().setBoard(board);
|
||||||
rootNode.getState().setPlayerNo(oponent);
|
rootNode.getState().setPlayerNo(opponent);
|
||||||
|
|
||||||
while (System.currentTimeMillis() < end) {
|
while (System.currentTimeMillis() < end) {
|
||||||
// Phase 1 - Selection
|
// Phase 1 - Selection
|
||||||
@ -93,7 +93,7 @@ public class MonteCarloTreeSearch {
|
|||||||
State tempState = tempNode.getState();
|
State tempState = tempNode.getState();
|
||||||
int boardStatus = tempState.getBoard().checkStatus();
|
int boardStatus = tempState.getBoard().checkStatus();
|
||||||
|
|
||||||
if (boardStatus == oponent) {
|
if (boardStatus == opponent) {
|
||||||
tempNode.getParent().getState().setWinScore(Integer.MIN_VALUE);
|
tempNode.getParent().getState().setWinScore(Integer.MIN_VALUE);
|
||||||
return boardStatus;
|
return boardStatus;
|
||||||
}
|
}
|
@ -87,7 +87,7 @@ public class State {
|
|||||||
void randomPlay() {
|
void randomPlay() {
|
||||||
List<Position> availablePositions = this.board.getEmptyPositions();
|
List<Position> availablePositions = this.board.getEmptyPositions();
|
||||||
int totalPossibilities = availablePositions.size();
|
int totalPossibilities = availablePositions.size();
|
||||||
int selectRandom = (int) (Math.random() * ((totalPossibilities - 1) + 1));
|
int selectRandom = (int) (Math.random() * totalPossibilities);
|
||||||
this.board.performMove(this.playerNo, availablePositions.get(selectRandom));
|
this.board.performMove(this.playerNo, availablePositions.get(selectRandom));
|
||||||
}
|
}
|
||||||
|
|
@ -148,7 +148,7 @@ public class Board {
|
|||||||
System.out.println("Game Draw");
|
System.out.println("Game Draw");
|
||||||
break;
|
break;
|
||||||
case IN_PROGRESS:
|
case IN_PROGRESS:
|
||||||
System.out.println("Game In rogress");
|
System.out.println("Game In Progress");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package com.baeldung.algorithms.mcts.tree;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.mcts.montecarlo.State;
|
||||||
|
|
||||||
|
public class Node {
|
||||||
|
State state;
|
||||||
|
Node parent;
|
||||||
|
List<Node> childArray;
|
||||||
|
|
||||||
|
public Node() {
|
||||||
|
this.state = new State();
|
||||||
|
childArray = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(State state) {
|
||||||
|
this.state = state;
|
||||||
|
childArray = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(State state, Node parent, List<Node> childArray) {
|
||||||
|
this.state = state;
|
||||||
|
this.parent = parent;
|
||||||
|
this.childArray = childArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(Node node) {
|
||||||
|
this.childArray = new ArrayList<>();
|
||||||
|
this.state = new State(node.getState());
|
||||||
|
if (node.getParent() != null)
|
||||||
|
this.parent = node.getParent();
|
||||||
|
List<Node> childArray = node.getChildArray();
|
||||||
|
for (Node child : childArray) {
|
||||||
|
this.childArray.add(new Node(child));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public State getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(State state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node getParent() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParent(Node parent) {
|
||||||
|
this.parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Node> getChildArray() {
|
||||||
|
return childArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChildArray(List<Node> childArray) {
|
||||||
|
this.childArray = childArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node getRandomChildNode() {
|
||||||
|
int noOfPossibleMoves = this.childArray.size();
|
||||||
|
int selectRandom = (int) (Math.random() * noOfPossibleMoves);
|
||||||
|
return this.childArray.get(selectRandom);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node getChildWithMaxScore() {
|
||||||
|
return Collections.max(this.childArray, Comparator.comparing(c -> {
|
||||||
|
return c.getState().getVisitCount();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package com.baeldung.algorithms.middleelementlookup;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class MiddleElementLookup {
|
||||||
|
|
||||||
|
public static Optional<String> findMiddleElementLinkedList(LinkedList<String> linkedList) {
|
||||||
|
if (linkedList == null || linkedList.isEmpty()) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.ofNullable(linkedList.get((linkedList.size() - 1) / 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<String> findMiddleElementFromHead(Node head) {
|
||||||
|
if (head == null) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the size of the list
|
||||||
|
Node current = head;
|
||||||
|
int size = 1;
|
||||||
|
while (current.hasNext()) {
|
||||||
|
current = current.next();
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterate till the middle element
|
||||||
|
current = head;
|
||||||
|
for (int i = 0; i < (size - 1) / 2; i++) {
|
||||||
|
current = current.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.ofNullable(current.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<String> findMiddleElementFromHead1PassRecursively(Node head) {
|
||||||
|
if (head == null) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
MiddleAuxRecursion middleAux = new MiddleAuxRecursion();
|
||||||
|
findMiddleRecursively(head, middleAux);
|
||||||
|
return Optional.ofNullable(middleAux.middle.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void findMiddleRecursively(Node node, MiddleAuxRecursion middleAux) {
|
||||||
|
if (node == null) {
|
||||||
|
// reached the end
|
||||||
|
middleAux.length = middleAux.length / 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
middleAux.length++;
|
||||||
|
findMiddleRecursively(node.next(), middleAux);
|
||||||
|
|
||||||
|
if (middleAux.length == 0) {
|
||||||
|
// found the middle
|
||||||
|
middleAux.middle = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
middleAux.length--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<String> findMiddleElementFromHead1PassIteratively(Node head) {
|
||||||
|
if (head == null) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
Node slowPointer = head;
|
||||||
|
Node fastPointer = head;
|
||||||
|
|
||||||
|
while (fastPointer.hasNext() && fastPointer.next()
|
||||||
|
.hasNext()) {
|
||||||
|
fastPointer = fastPointer.next()
|
||||||
|
.next();
|
||||||
|
slowPointer = slowPointer.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.ofNullable(slowPointer.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MiddleAuxRecursion {
|
||||||
|
Node middle;
|
||||||
|
int length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.baeldung.algorithms.middleelementlookup;
|
||||||
|
|
||||||
|
public class Node {
|
||||||
|
private Node next;
|
||||||
|
private String data;
|
||||||
|
|
||||||
|
public Node(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNext() {
|
||||||
|
return next != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node next() {
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNext(Node next) {
|
||||||
|
this.next = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return this.data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,123 @@
|
|||||||
|
package com.baeldung.algorithms.permutation;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class Permutation {
|
||||||
|
|
||||||
|
public static <T> void printAllRecursive(T[] elements, char delimiter) {
|
||||||
|
printAllRecursive(elements.length, elements, delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> void printAllRecursive(int n, T[] elements, char delimiter) {
|
||||||
|
|
||||||
|
if(n == 1) {
|
||||||
|
printArray(elements, delimiter);
|
||||||
|
} else {
|
||||||
|
for(int i = 0; i < n-1; i++) {
|
||||||
|
printAllRecursive(n - 1, elements, delimiter);
|
||||||
|
if(n % 2 == 0) {
|
||||||
|
swap(elements, i, n-1);
|
||||||
|
} else {
|
||||||
|
swap(elements, 0, n-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printAllRecursive(n - 1, elements, delimiter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> void printAllIterative(int n, T[] elements, char delimiter) {
|
||||||
|
|
||||||
|
int[] indexes = new int[n];
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
indexes[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printArray(elements, delimiter);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (i < n) {
|
||||||
|
if (indexes[i] < i) {
|
||||||
|
swap(elements, i % 2 == 0 ? 0: indexes[i], i);
|
||||||
|
printArray(elements, delimiter);
|
||||||
|
indexes[i]++;
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
indexes[i] = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends Comparable<T>> void printAllOrdered(T[] elements, char delimiter) {
|
||||||
|
|
||||||
|
Arrays.sort(elements);
|
||||||
|
boolean hasNext = true;
|
||||||
|
|
||||||
|
while(hasNext) {
|
||||||
|
printArray(elements, delimiter);
|
||||||
|
int k = 0, l = 0;
|
||||||
|
hasNext = false;
|
||||||
|
for (int i = elements.length - 1; i > 0; i--) {
|
||||||
|
if (elements[i].compareTo(elements[i - 1]) > 0) {
|
||||||
|
k = i - 1;
|
||||||
|
hasNext = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = elements.length - 1; i > k; i--) {
|
||||||
|
if (elements[i].compareTo(elements[k]) > 0) {
|
||||||
|
l = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
swap(elements, k, l);
|
||||||
|
Collections.reverse(Arrays.asList(elements).subList(k + 1, elements.length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> void printRandom(T[] elements, char delimiter) {
|
||||||
|
|
||||||
|
Collections.shuffle(Arrays.asList(elements));
|
||||||
|
printArray(elements, delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> void swap(T[] elements, int a, int b) {
|
||||||
|
|
||||||
|
T tmp = elements[a];
|
||||||
|
elements[a] = elements[b];
|
||||||
|
elements[b] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> void printArray(T[] elements, char delimiter) {
|
||||||
|
|
||||||
|
String delimiterSpace = delimiter + " ";
|
||||||
|
for(int i = 0; i < elements.length; i++) {
|
||||||
|
System.out.print(elements[i] + delimiterSpace);
|
||||||
|
}
|
||||||
|
System.out.print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] argv) {
|
||||||
|
|
||||||
|
Integer[] elements = {1,2,3,4};
|
||||||
|
|
||||||
|
System.out.println("Rec:");
|
||||||
|
printAllRecursive(elements, ';');
|
||||||
|
|
||||||
|
System.out.println("Iter:");
|
||||||
|
printAllIterative(elements.length, elements, ';');
|
||||||
|
|
||||||
|
System.out.println("Orderes:");
|
||||||
|
printAllOrdered(elements, ';');
|
||||||
|
|
||||||
|
System.out.println("Random:");
|
||||||
|
printRandom(elements, ';');
|
||||||
|
|
||||||
|
System.out.println("Random:");
|
||||||
|
printRandom(elements, ';');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.baeldung.algorithms.string;
|
||||||
|
|
||||||
|
public class EnglishAlphabetLetters {
|
||||||
|
|
||||||
|
public static boolean checkStringForAllTheLetters(String input) {
|
||||||
|
boolean[] visited = new boolean[26];
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
for (int id = 0; id < input.length(); id++) {
|
||||||
|
if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') {
|
||||||
|
index = input.charAt(id) - 'a';
|
||||||
|
} else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') {
|
||||||
|
index = input.charAt(id) - 'A';
|
||||||
|
}
|
||||||
|
visited[index] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int id = 0; id < 26; id++) {
|
||||||
|
if (!visited[id]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkStringForAllLetterUsingStream(String input) {
|
||||||
|
long c = input.toLowerCase().chars().filter(ch -> ch >= 'a' && ch <= 'z').distinct().count();
|
||||||
|
return c == 26;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
checkStringForAllLetterUsingStream("intit");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.baeldung.algorithms.string;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class LongestSubstringNonRepeatingCharacters {
|
||||||
|
|
||||||
|
public static String getUniqueCharacterSubstringBruteForce(String input) {
|
||||||
|
String output = "";
|
||||||
|
for (int start = 0; start < input.length(); start++) {
|
||||||
|
Set<Character> visited = new HashSet<>();
|
||||||
|
int end = start;
|
||||||
|
for (; end < input.length(); end++) {
|
||||||
|
char currChar = input.charAt(end);
|
||||||
|
if (visited.contains(currChar)) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
visited.add(currChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (output.length() < end - start + 1) {
|
||||||
|
output = input.substring(start, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUniqueCharacterSubstring(String input) {
|
||||||
|
Map<Character, Integer> visited = new HashMap<>();
|
||||||
|
String output = "";
|
||||||
|
for (int start = 0, end = 0; end < input.length(); end++) {
|
||||||
|
char currChar = input.charAt(end);
|
||||||
|
if (visited.containsKey(currChar)) {
|
||||||
|
start = Math.max(visited.get(currChar) + 1, start);
|
||||||
|
}
|
||||||
|
if (output.length() < end - start + 1) {
|
||||||
|
output = input.substring(start, end + 1);
|
||||||
|
}
|
||||||
|
visited.put(currChar, end);
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
if(args.length > 0) {
|
||||||
|
System.out.println(getUniqueCharacterSubstring(args[0]));
|
||||||
|
} else {
|
||||||
|
System.err.println("This program expects command-line input. Please try again!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
package com.baeldung.algorithms.string;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class SubstringPalindrome {
|
||||||
|
|
||||||
|
public Set<String> findAllPalindromesUsingCenter(String input) {
|
||||||
|
final Set<String> palindromes = new HashSet<>();
|
||||||
|
if (input == null || input.isEmpty()) {
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
if (input.length() == 1) {
|
||||||
|
palindromes.add(input);
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < input.length(); i++) {
|
||||||
|
palindromes.addAll(findPalindromes(input, i, i + 1));
|
||||||
|
palindromes.addAll(findPalindromes(input, i, i));
|
||||||
|
}
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> findPalindromes(String input, int low, int high) {
|
||||||
|
Set<String> result = new HashSet<>();
|
||||||
|
while (low >= 0 && high < input.length() && input.charAt(low) == input.charAt(high)) {
|
||||||
|
result.add(input.substring(low, high + 1));
|
||||||
|
low--;
|
||||||
|
high++;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> findAllPalindromesUsingBruteForceApproach(String input) {
|
||||||
|
Set<String> palindromes = new HashSet<>();
|
||||||
|
if (input == null || input.isEmpty()) {
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
if (input.length() == 1) {
|
||||||
|
palindromes.add(input);
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < input.length(); i++) {
|
||||||
|
for (int j = i + 1; j <= input.length(); j++)
|
||||||
|
if (isPalindrome(input.substring(i, j))) {
|
||||||
|
palindromes.add(input.substring(i, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isPalindrome(String input) {
|
||||||
|
StringBuilder plain = new StringBuilder(input);
|
||||||
|
StringBuilder reverse = plain.reverse();
|
||||||
|
return (reverse.toString()).equals(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> findAllPalindromesUsingManachersAlgorithm(String input) {
|
||||||
|
Set<String> palindromes = new HashSet<>();
|
||||||
|
String formattedInput = "@" + input + "#";
|
||||||
|
char inputCharArr[] = formattedInput.toCharArray();
|
||||||
|
int max;
|
||||||
|
int radius[][] = new int[2][input.length() + 1];
|
||||||
|
for (int j = 0; j <= 1; j++) {
|
||||||
|
radius[j][0] = max = 0;
|
||||||
|
int i = 1;
|
||||||
|
while (i <= input.length()) {
|
||||||
|
palindromes.add(Character.toString(inputCharArr[i]));
|
||||||
|
while (inputCharArr[i - max - 1] == inputCharArr[i + j + max])
|
||||||
|
max++;
|
||||||
|
radius[j][i] = max;
|
||||||
|
int k = 1;
|
||||||
|
while ((radius[j][i - k] != max - k) && (k < max)) {
|
||||||
|
radius[j][i + k] = Math.min(radius[j][i - k], max - k);
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
max = Math.max(max - k, 0);
|
||||||
|
i += k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= input.length(); i++) {
|
||||||
|
for (int j = 0; j <= 1; j++) {
|
||||||
|
for (max = radius[j][i]; max > 0; max--) {
|
||||||
|
palindromes.add(input.substring(i - max - 1, max + j + i - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return palindromes;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.baeldung.algorithms.twopointertechnique;
|
||||||
|
|
||||||
|
public class LinkedListFindMiddle {
|
||||||
|
|
||||||
|
public <T> T findMiddle(MyNode<T> head) {
|
||||||
|
MyNode<T> slowPointer = head;
|
||||||
|
MyNode<T> fastPointer = head;
|
||||||
|
|
||||||
|
while (fastPointer.next != null && fastPointer.next.next != null) {
|
||||||
|
fastPointer = fastPointer.next.next;
|
||||||
|
slowPointer = slowPointer.next;
|
||||||
|
}
|
||||||
|
return slowPointer.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.algorithms.twopointertechnique;
|
||||||
|
|
||||||
|
public class MyNode<E> {
|
||||||
|
MyNode<E> next;
|
||||||
|
E data;
|
||||||
|
|
||||||
|
public MyNode(E value) {
|
||||||
|
data = value;
|
||||||
|
next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyNode(E value, MyNode<E> n) {
|
||||||
|
data = value;
|
||||||
|
next = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNext(MyNode<E> n) {
|
||||||
|
next = n;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.algorithms.twopointertechnique;
|
||||||
|
|
||||||
|
public class RotateArray {
|
||||||
|
|
||||||
|
public void rotate(int[] input, int step) {
|
||||||
|
step %= input.length;
|
||||||
|
reverse(input, 0, input.length - 1);
|
||||||
|
reverse(input, 0, step - 1);
|
||||||
|
reverse(input, step, input.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reverse(int[] input, int start, int end) {
|
||||||
|
while (start < end) {
|
||||||
|
int temp = input[start];
|
||||||
|
input[start] = input[end];
|
||||||
|
input[end] = temp;
|
||||||
|
start++;
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.algorithms.twopointertechnique;
|
||||||
|
|
||||||
|
public class TwoSum {
|
||||||
|
|
||||||
|
public boolean twoSum(int[] input, int targetValue) {
|
||||||
|
|
||||||
|
int pointerOne = 0;
|
||||||
|
int pointerTwo = input.length - 1;
|
||||||
|
|
||||||
|
while (pointerOne < pointerTwo) {
|
||||||
|
int sum = input[pointerOne] + input[pointerTwo];
|
||||||
|
|
||||||
|
if (sum == targetValue) {
|
||||||
|
return true;
|
||||||
|
} else if (sum < targetValue) {
|
||||||
|
pointerOne++;
|
||||||
|
} else {
|
||||||
|
pointerTwo--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean twoSumSlow(int[] input, int targetValue) {
|
||||||
|
|
||||||
|
for (int i = 0; i < input.length; i++) {
|
||||||
|
for (int j = 1; j < input.length; j++) {
|
||||||
|
if (input[i] + input[j] == targetValue) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
algorithms-miscellaneous-1/src/main/resources/logback.xml
Normal file
13
algorithms-miscellaneous-1/src/main/resources/logback.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.hillclimbing.HillClimbing;
|
||||||
|
import com.baeldung.algorithms.hillclimbing.State;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class HillClimbingAlgorithmUnitTest {
|
||||||
|
private Stack<String> initStack;
|
||||||
|
private Stack<String> goalStack;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void initStacks() {
|
||||||
|
String blockArr[] = { "B", "C", "D", "A" };
|
||||||
|
String goalBlockArr[] = { "A", "B", "C", "D" };
|
||||||
|
initStack = new Stack<>();
|
||||||
|
for (String block : blockArr)
|
||||||
|
initStack.push(block);
|
||||||
|
goalStack = new Stack<>();
|
||||||
|
for (String block : goalBlockArr)
|
||||||
|
goalStack.push(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenInitAndGoalState_whenGetPathWithHillClimbing_thenPathFound() {
|
||||||
|
HillClimbing hillClimbing = new HillClimbing();
|
||||||
|
|
||||||
|
List<State> path;
|
||||||
|
try {
|
||||||
|
path = hillClimbing.getRouteWithHillClimbing(initStack, goalStack);
|
||||||
|
assertNotNull(path);
|
||||||
|
assertEquals(path.get(path.size() - 1)
|
||||||
|
.getState()
|
||||||
|
.get(0), goalStack);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCurrentState_whenFindNextState_thenBetterHeuristics() {
|
||||||
|
HillClimbing hillClimbing = new HillClimbing();
|
||||||
|
List<Stack<String>> initList = new ArrayList<>();
|
||||||
|
initList.add(initStack);
|
||||||
|
State currentState = new State(initList);
|
||||||
|
currentState.setHeuristics(hillClimbing.getHeuristicsValue(initList, goalStack));
|
||||||
|
State nextState = hillClimbing.findNextState(currentState, goalStack);
|
||||||
|
assertTrue(nextState.getHeuristics() > currentState.getHeuristics());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.middleelementlookup.MiddleElementLookup;
|
||||||
|
import com.baeldung.algorithms.middleelementlookup.Node;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
|
||||||
|
public class MiddleElementLookupUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFindingMiddleLinkedList_thenMiddleFound() {
|
||||||
|
assertEquals("3", MiddleElementLookup
|
||||||
|
.findMiddleElementLinkedList(createLinkedList(5))
|
||||||
|
.get());
|
||||||
|
assertEquals("2", MiddleElementLookup
|
||||||
|
.findMiddleElementLinkedList(createLinkedList(4))
|
||||||
|
.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFindingMiddleFromHead_thenMiddleFound() {
|
||||||
|
assertEquals("3", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead(createNodesList(5))
|
||||||
|
.get());
|
||||||
|
assertEquals("2", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead(createNodesList(4))
|
||||||
|
.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFindingMiddleFromHead1PassRecursively_thenMiddleFound() {
|
||||||
|
assertEquals("3", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassRecursively(createNodesList(5))
|
||||||
|
.get());
|
||||||
|
assertEquals("2", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassRecursively(createNodesList(4))
|
||||||
|
.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFindingMiddleFromHead1PassIteratively_thenMiddleFound() {
|
||||||
|
assertEquals("3", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassIteratively(createNodesList(5))
|
||||||
|
.get());
|
||||||
|
assertEquals("2", MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassIteratively(createNodesList(4))
|
||||||
|
.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenListEmptyOrNull_thenMiddleNotFound() {
|
||||||
|
// null list
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementLinkedList(null)
|
||||||
|
.isPresent());
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead(null)
|
||||||
|
.isPresent());
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassIteratively(null)
|
||||||
|
.isPresent());
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassRecursively(null)
|
||||||
|
.isPresent());
|
||||||
|
|
||||||
|
// empty LinkedList
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementLinkedList(new LinkedList<>())
|
||||||
|
.isPresent());
|
||||||
|
|
||||||
|
// LinkedList with nulls
|
||||||
|
LinkedList<String> nullsList = new LinkedList<>();
|
||||||
|
nullsList.add(null);
|
||||||
|
nullsList.add(null);
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementLinkedList(nullsList)
|
||||||
|
.isPresent());
|
||||||
|
|
||||||
|
// nodes with null values
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead(new Node(null))
|
||||||
|
.isPresent());
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassIteratively(new Node(null))
|
||||||
|
.isPresent());
|
||||||
|
assertFalse(MiddleElementLookup
|
||||||
|
.findMiddleElementFromHead1PassRecursively(new Node(null))
|
||||||
|
.isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LinkedList<String> createLinkedList(int n) {
|
||||||
|
LinkedList<String> list = new LinkedList<>();
|
||||||
|
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
list.add(String.valueOf(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Node createNodesList(int n) {
|
||||||
|
Node head = new Node("1");
|
||||||
|
Node current = head;
|
||||||
|
|
||||||
|
for (int i = 2; i <= n; i++) {
|
||||||
|
Node newNode = new Node(String.valueOf(i));
|
||||||
|
current.setNext(newNode);
|
||||||
|
current = newNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import com.baeldung.algorithms.automata.*;
|
import com.baeldung.algorithms.automata.*;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.string.search.StringSearchAlgorithms;
|
||||||
|
|
||||||
|
public class StringSearchAlgorithmsUnitTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStringSearchAlgorithms(){
|
||||||
|
String text = "This is some nice text.";
|
||||||
|
String pattern = "some";
|
||||||
|
|
||||||
|
int realPosition = text.indexOf(pattern);
|
||||||
|
Assert.assertTrue(realPosition == StringSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == StringSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == StringSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.baeldung.algorithms.binarysearch;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import com.baeldung.algorithms.binarysearch.BinarySearch;
|
||||||
|
|
||||||
|
public class BinarySearchUnitTest {
|
||||||
|
|
||||||
|
int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
|
||||||
|
int key = 6;
|
||||||
|
int expectedIndexForSearchKey = 7;
|
||||||
|
int low = 0;
|
||||||
|
int high = sortedArray.length - 1;
|
||||||
|
List<Integer> sortedList = Arrays.asList(0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.baeldung.algorithms.enumstatemachine;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class LeaveRequestStateUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenLeaveRequest_whenStateEscalated_thenResponsibleIsTeamLeader() {
|
||||||
|
LeaveRequestState state = LeaveRequestState.Escalated;
|
||||||
|
|
||||||
|
assertEquals(state.responsiblePerson(), "Team Leader");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenLeaveRequest_whenStateApproved_thenResponsibleIsDepartmentManager() {
|
||||||
|
LeaveRequestState state = LeaveRequestState.Approved;
|
||||||
|
|
||||||
|
assertEquals(state.responsiblePerson(), "Department Manager");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenLeaveRequest_whenNextStateIsCalled_thenStateIsChanged() {
|
||||||
|
LeaveRequestState state = LeaveRequestState.Submitted;
|
||||||
|
|
||||||
|
state = state.nextState();
|
||||||
|
assertEquals(state, LeaveRequestState.Escalated);
|
||||||
|
|
||||||
|
state = state.nextState();
|
||||||
|
assertEquals(state, LeaveRequestState.Approved);
|
||||||
|
|
||||||
|
state = state.nextState();
|
||||||
|
assertEquals(state, LeaveRequestState.Approved);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.baeldung.algorithms.factorial;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class FactorialUnitTest {
|
||||||
|
|
||||||
|
Factorial factorial;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
factorial = new Factorial();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingForLoop_thenCorrect() {
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingStreams_thenCorrect() {
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingRecursion_thenCorrect() {
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingMemoize_thenCorrect() {
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120);
|
||||||
|
|
||||||
|
n = 6;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialHavingLargeResult_thenCorrect() {
|
||||||
|
int n = 22;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() {
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatingFactorialUsingGuava_thenCorrect() {
|
||||||
|
int n = 22;
|
||||||
|
|
||||||
|
assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.baeldung.algorithms.linesintersection;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class LinesIntersectionServiceUnitTest {
|
||||||
|
private LinesIntersectionService service = new LinesIntersectionService();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNotParallelLines_whenCalculatePoint_thenPresent() {
|
||||||
|
|
||||||
|
double m1 = 0;
|
||||||
|
double b1 = 0;
|
||||||
|
double m2 = 1;
|
||||||
|
double b2 = -1;
|
||||||
|
|
||||||
|
Optional<Point> point = service.calculateIntersectionPoint(m1, b1, m2, b2);
|
||||||
|
|
||||||
|
assertTrue(point.isPresent());
|
||||||
|
assertEquals(point.get().getX(), 1, 0.001);
|
||||||
|
assertEquals(point.get().getY(), 0, 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenParallelLines_whenCalculatePoint_thenEmpty() {
|
||||||
|
double m1 = 1;
|
||||||
|
double b1 = 0;
|
||||||
|
double m2 = 1;
|
||||||
|
double b2 = -1;
|
||||||
|
|
||||||
|
Optional<Point> point = service.calculateIntersectionPoint(m1, b1, m2, b2);
|
||||||
|
|
||||||
|
assertFalse(point.isPresent());
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user