Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -39,7 +39,6 @@ target/
|
|||||||
spring-openid/src/main/resources/application.properties
|
spring-openid/src/main/resources/application.properties
|
||||||
.recommenders/
|
.recommenders/
|
||||||
/spring-hibernate4/nbproject/
|
/spring-hibernate4/nbproject/
|
||||||
spring-security-openid/src/main/resources/application.properties
|
|
||||||
|
|
||||||
spring-all/*.log
|
spring-all/*.log
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
**UPDATE**: The price of "Learn Spring Security OAuth" will permanently change on the 11th of December, along with the upcoming OAuth2 material: http://bit.ly/github-lss
|
||||||
|
|
||||||
The Courses
|
The Courses
|
||||||
==============================
|
==============================
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import akka.http.javadsl.model.HttpEntities;
|
|||||||
import akka.http.javadsl.model.HttpRequest;
|
import akka.http.javadsl.model.HttpRequest;
|
||||||
import akka.http.javadsl.testkit.JUnitRouteTest;
|
import akka.http.javadsl.testkit.JUnitRouteTest;
|
||||||
import akka.http.javadsl.testkit.TestRoute;
|
import akka.http.javadsl.testkit.TestRoute;
|
||||||
|
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class UserServerUnitTest extends JUnitRouteTest {
|
public class UserServerUnitTest extends JUnitRouteTest {
|
||||||
@@ -17,6 +19,7 @@ public class UserServerUnitTest extends JUnitRouteTest {
|
|||||||
|
|
||||||
TestRoute appRoute = testRoute(new UserServer(userActorRef).routes());
|
TestRoute appRoute = testRoute(new UserServer(userActorRef).routes());
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void whenRequest_thenActorResponds() {
|
public void whenRequest_thenActorResponds() {
|
||||||
|
|
||||||
@@ -28,10 +31,10 @@ public class UserServerUnitTest extends JUnitRouteTest {
|
|||||||
.assertStatusCode(404);
|
.assertStatusCode(404);
|
||||||
|
|
||||||
appRoute.run(HttpRequest.DELETE("/users/1"))
|
appRoute.run(HttpRequest.DELETE("/users/1"))
|
||||||
.assertStatusCode(200);
|
.assertStatusCode(405);
|
||||||
|
|
||||||
appRoute.run(HttpRequest.DELETE("/users/42"))
|
appRoute.run(HttpRequest.DELETE("/users/42"))
|
||||||
.assertStatusCode(200);
|
.assertStatusCode(405);
|
||||||
|
|
||||||
appRoute.run(HttpRequest.POST("/users")
|
appRoute.run(HttpRequest.POST("/users")
|
||||||
.withEntity(HttpEntities.create(ContentTypes.APPLICATION_JSON, zaphod())))
|
.withEntity(HttpEntities.create(ContentTypes.APPLICATION_JSON, zaphod())))
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>cobertura-maven-plugin</artifactId>
|
<artifactId>cobertura-maven-plugin</artifactId>
|
||||||
<version>2.7</version>
|
<version>${cobertura.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<instrumentation>
|
<instrumentation>
|
||||||
<ignores>
|
<ignores>
|
||||||
@@ -85,6 +85,7 @@
|
|||||||
<commons-codec.version>1.11</commons-codec.version>
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
<guava.version>27.0.1-jre</guava.version>
|
<guava.version>27.0.1-jre</guava.version>
|
||||||
<combinatoricslib3.version>3.3.0</combinatoricslib3.version>
|
<combinatoricslib3.version>3.3.0</combinatoricslib3.version>
|
||||||
|
<cobertura.plugin.version>2.7</cobertura.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -13,4 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||||||
- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
|
- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
|
||||||
- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
|
- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
|
||||||
- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
|
- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
|
||||||
|
- [Implementing A* Pathfinding in Java](https://www.baeldung.com/java-a-star-pathfinding)
|
||||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
|
- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
|
||||||
|
|||||||
+1
-1
@@ -98,7 +98,7 @@ public class SlopeOne {
|
|||||||
for (Item j : InputData.items) {
|
for (Item j : InputData.items) {
|
||||||
if (e.getValue().containsKey(j)) {
|
if (e.getValue().containsKey(j)) {
|
||||||
clean.put(j, e.getValue().get(j));
|
clean.put(j, e.getValue().get(j));
|
||||||
} else {
|
} else if (!clean.containsKey(j)) {
|
||||||
clean.put(j, -1.0);
|
clean.put(j, -1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,5 +15,4 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||||||
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
|
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
|
||||||
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
|
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
|
||||||
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
|
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
|
||||||
- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
|
|
||||||
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
|
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
|
||||||
|
|||||||
@@ -46,13 +46,13 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>3.8.1</version>
|
<version>${commons.lang3.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>pl.pragmatists</groupId>
|
<groupId>pl.pragmatists</groupId>
|
||||||
<artifactId>JUnitParams</artifactId>
|
<artifactId>JUnitParams</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>${JUnitParams.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -91,6 +91,8 @@
|
|||||||
<retrofit.version>2.6.0</retrofit.version>
|
<retrofit.version>2.6.0</retrofit.version>
|
||||||
<jmh-core.version>1.19</jmh-core.version>
|
<jmh-core.version>1.19</jmh-core.version>
|
||||||
<jmh-generator.version>1.19</jmh-generator.version>
|
<jmh-generator.version>1.19</jmh-generator.version>
|
||||||
|
<commons.lang3.version>3.8.1</commons.lang3.version>
|
||||||
|
<JUnitParams.version>1.1.0</JUnitParams.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -10,4 +10,7 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||||||
- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
|
- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
|
||||||
- [Knapsack Problem Implementation in Java](https://www.baeldung.com/java-knapsack)
|
- [Knapsack Problem Implementation in Java](https://www.baeldung.com/java-knapsack)
|
||||||
- [How to Determine if a Binary Tree is Balanced](https://www.baeldung.com/java-balanced-binary-tree)
|
- [How to Determine if a Binary Tree is Balanced](https://www.baeldung.com/java-balanced-binary-tree)
|
||||||
|
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
|
||||||
|
- [Overview of Combinatorial Problems in Java](https://www.baeldung.com/java-combinatorial-algorithms)
|
||||||
|
- [Prim’s Algorithm](https://www.baeldung.com/java-prim-algorithm)
|
||||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
||||||
|
|||||||
@@ -34,6 +34,11 @@
|
|||||||
<artifactId>tradukisto</artifactId>
|
<artifactId>tradukisto</artifactId>
|
||||||
<version>${tradukisto.version}</version>
|
<version>${tradukisto.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.assertj</groupId>
|
<groupId>org.assertj</groupId>
|
||||||
@@ -60,6 +65,7 @@
|
|||||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||||
<commons-codec.version>1.11</commons-codec.version>
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
<commons-math3.version>3.6.1</commons-math3.version>
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
|
<guava.version>28.1-jre</guava.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbrackets;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
public class BalancedBracketsUsingDeque {
|
||||||
|
|
||||||
|
public boolean isBalanced(String str) {
|
||||||
|
if (null == str || ((str.length() % 2) != 0)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
char[] ch = str.toCharArray();
|
||||||
|
for (char c : ch) {
|
||||||
|
if (!(c == '{' || c == '[' || c == '(' || c == '}' || c == ']' || c == ')')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Deque<Character> deque = new LinkedList<>();
|
||||||
|
for (char ch : str.toCharArray()) {
|
||||||
|
if (ch == '{' || ch == '[' || ch == '(') {
|
||||||
|
deque.addFirst(ch);
|
||||||
|
} else {
|
||||||
|
if (!deque.isEmpty() && ((deque.peekFirst() == '{' && ch == '}') || (deque.peekFirst() == '[' && ch == ']') || (deque.peekFirst() == '(' && ch == ')'))) {
|
||||||
|
deque.removeFirst();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbrackets;
|
||||||
|
|
||||||
|
public class BalancedBracketsUsingString {
|
||||||
|
|
||||||
|
public boolean isBalanced(String str) {
|
||||||
|
if (null == str || ((str.length() % 2) != 0)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
char[] ch = str.toCharArray();
|
||||||
|
for (char c : ch) {
|
||||||
|
if (!(c == '{' || c == '[' || c == '(' || c == '}' || c == ']' || c == ')')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (str.contains("()") || str.contains("[]") || str.contains("{}")) {
|
||||||
|
str = str.replaceAll("\\(\\)", "")
|
||||||
|
.replaceAll("\\[\\]", "")
|
||||||
|
.replaceAll("\\{\\}", "");
|
||||||
|
}
|
||||||
|
return (str.length() == 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
public class Follower {
|
||||||
|
|
||||||
|
@Getter String username;
|
||||||
|
@Getter long count;
|
||||||
|
|
||||||
|
public Follower(String username, long count) {
|
||||||
|
super();
|
||||||
|
this.username = username;
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "User: " + username + ", Followers: " + count + "\n\r" ;
|
||||||
|
}
|
||||||
|
}
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FollowersPath {
|
||||||
|
|
||||||
|
private List<Follower> accounts;
|
||||||
|
private long count;
|
||||||
|
|
||||||
|
public FollowersPath() {
|
||||||
|
super();
|
||||||
|
this.accounts = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Follower> getAccounts() {
|
||||||
|
return accounts;
|
||||||
|
}
|
||||||
|
public long getCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFollower(String username, long count) {
|
||||||
|
accounts.add(new Follower(username, count));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCount(long count) {
|
||||||
|
this.count += count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String details = "";
|
||||||
|
for(Follower a : accounts) {
|
||||||
|
details+=a.toString() + ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Total: " + count + ", \n\r" +
|
||||||
|
" Details: { " + "\n\r" +
|
||||||
|
details + "\n\r" +
|
||||||
|
" }";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GreedyAlgorithm {
|
||||||
|
|
||||||
|
int currentLevel = 0;
|
||||||
|
final int maxLevel = 3;
|
||||||
|
SocialConnector sc;
|
||||||
|
FollowersPath fp;
|
||||||
|
|
||||||
|
public GreedyAlgorithm(SocialConnector sc) {
|
||||||
|
super();
|
||||||
|
this.sc = sc;
|
||||||
|
this.fp = new FollowersPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long findMostFollowersPath(String account) {
|
||||||
|
long max = 0;
|
||||||
|
SocialUser toFollow = null;
|
||||||
|
|
||||||
|
List<SocialUser> followers = sc.getFollowers(account);
|
||||||
|
for (SocialUser el : followers) {
|
||||||
|
long followersCount = el.getFollowersCount();
|
||||||
|
if (followersCount > max) {
|
||||||
|
toFollow = el;
|
||||||
|
max = followersCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentLevel < maxLevel - 1) {
|
||||||
|
currentLevel++;
|
||||||
|
max += findMostFollowersPath(toFollow.getUsername());
|
||||||
|
return max;
|
||||||
|
} else {
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FollowersPath getFollowers() {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
}
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NonGreedyAlgorithm {
|
||||||
|
|
||||||
|
int currentLevel = 0;
|
||||||
|
final int maxLevel = 3;
|
||||||
|
SocialConnector tc;
|
||||||
|
|
||||||
|
public NonGreedyAlgorithm(SocialConnector tc, int level) {
|
||||||
|
super();
|
||||||
|
this.tc = tc;
|
||||||
|
this.currentLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long findMostFollowersPath(String account) {
|
||||||
|
List<SocialUser> followers = tc.getFollowers(account);
|
||||||
|
long total = currentLevel > 0 ? followers.size() : 0;
|
||||||
|
|
||||||
|
if (currentLevel < maxLevel ) {
|
||||||
|
currentLevel++;
|
||||||
|
|
||||||
|
long[] count = new long[followers.size()];
|
||||||
|
int i = 0;
|
||||||
|
for (SocialUser el : followers) {
|
||||||
|
NonGreedyAlgorithm sub = new NonGreedyAlgorithm(tc, currentLevel);
|
||||||
|
count[i] = sub.findMostFollowersPath(el.getUsername());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
long max = 0;
|
||||||
|
for (; i > 0; i--) {
|
||||||
|
if (count[i-1] > max )
|
||||||
|
max = count[i-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return total + max;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public class SocialConnector {
|
||||||
|
private boolean isCounterEnabled = true;
|
||||||
|
private int counter = 4;
|
||||||
|
@Getter @Setter List<SocialUser> users;
|
||||||
|
|
||||||
|
public SocialConnector() {
|
||||||
|
users = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean switchCounter() {
|
||||||
|
this.isCounterEnabled = !this.isCounterEnabled;
|
||||||
|
return this.isCounterEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SocialUser> getFollowers(String account) {
|
||||||
|
if (counter < 0)
|
||||||
|
throw new IllegalStateException ("API limit reached");
|
||||||
|
else {
|
||||||
|
if(this.isCounterEnabled) counter--;
|
||||||
|
for(SocialUser user : users) {
|
||||||
|
if (user.getUsername().equals(account)) {
|
||||||
|
return user.getFollowers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
public class SocialUser {
|
||||||
|
|
||||||
|
@Getter private String username;
|
||||||
|
@Getter private List<SocialUser> followers;
|
||||||
|
|
||||||
|
public SocialUser(String username) {
|
||||||
|
super();
|
||||||
|
this.username = username;
|
||||||
|
this.followers = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocialUser(String username, List<SocialUser> followers) {
|
||||||
|
super();
|
||||||
|
this.username = username;
|
||||||
|
this.followers = followers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getFollowersCount() {
|
||||||
|
return followers.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFollowers(List<SocialUser> followers) {
|
||||||
|
this.followers.addAll(followers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
return ((SocialUser) obj).getUsername().equals(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
package com.baeldung.algorithms.integerstreammedian;
|
||||||
|
|
||||||
|
import java.util.PriorityQueue;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
import static java.util.Comparator.reverseOrder;
|
||||||
|
|
||||||
|
public class MedianOfIntegerStream {
|
||||||
|
|
||||||
|
private Queue<Integer> minHeap, maxHeap;
|
||||||
|
|
||||||
|
MedianOfIntegerStream() {
|
||||||
|
minHeap = new PriorityQueue<>();
|
||||||
|
maxHeap = new PriorityQueue<>(reverseOrder());
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(int num) {
|
||||||
|
if (!minHeap.isEmpty() && num < minHeap.peek()) {
|
||||||
|
maxHeap.offer(num);
|
||||||
|
if (maxHeap.size() > minHeap.size() + 1) {
|
||||||
|
minHeap.offer(maxHeap.poll());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
minHeap.offer(num);
|
||||||
|
if (minHeap.size() > maxHeap.size() + 1) {
|
||||||
|
maxHeap.offer(minHeap.poll());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double getMedian() {
|
||||||
|
int median;
|
||||||
|
if (minHeap.size() < maxHeap.size()) {
|
||||||
|
median = maxHeap.peek();
|
||||||
|
} else if (minHeap.size() > maxHeap.size()) {
|
||||||
|
median = minHeap.peek();
|
||||||
|
} else {
|
||||||
|
median = (minHeap.peek() + maxHeap.peek()) / 2;
|
||||||
|
}
|
||||||
|
return median;
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.baeldung.algorithms.integerstreammedian;
|
||||||
|
|
||||||
|
import java.util.PriorityQueue;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
import static java.util.Comparator.reverseOrder;
|
||||||
|
|
||||||
|
public class MedianOfIntegerStream2 {
|
||||||
|
|
||||||
|
private Queue<Integer> minHeap, maxHeap;
|
||||||
|
|
||||||
|
MedianOfIntegerStream2() {
|
||||||
|
minHeap = new PriorityQueue<>();
|
||||||
|
maxHeap = new PriorityQueue<>(reverseOrder());
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(int num) {
|
||||||
|
if (minHeap.size() == maxHeap.size()) {
|
||||||
|
maxHeap.offer(num);
|
||||||
|
minHeap.offer(maxHeap.poll());
|
||||||
|
} else {
|
||||||
|
minHeap.offer(num);
|
||||||
|
maxHeap.offer(minHeap.poll());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double getMedian() {
|
||||||
|
int median;
|
||||||
|
if (minHeap.size() > maxHeap.size()) {
|
||||||
|
median = minHeap.peek();
|
||||||
|
} else {
|
||||||
|
median = (minHeap.peek() + maxHeap.peek()) / 2;
|
||||||
|
}
|
||||||
|
return median;
|
||||||
|
}
|
||||||
|
}
|
||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
package com.baeldung.algorithms.kruskal;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CycleDetector {
|
||||||
|
|
||||||
|
List<DisjointSetInfo> nodes;
|
||||||
|
|
||||||
|
public CycleDetector(int totalNodes) {
|
||||||
|
initDisjointSets(totalNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detectCycle(Integer u, Integer v) {
|
||||||
|
Integer rootU = pathCompressionFind(u);
|
||||||
|
Integer rootV = pathCompressionFind(v);
|
||||||
|
if (rootU.equals(rootV)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
unionByRank(rootU, rootV);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initDisjointSets(int totalNodes) {
|
||||||
|
nodes = new ArrayList<>(totalNodes);
|
||||||
|
for (int i = 0; i < totalNodes; i++) {
|
||||||
|
nodes.add(new DisjointSetInfo(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer find(Integer node) {
|
||||||
|
Integer parent = nodes.get(node).getParentNode();
|
||||||
|
if (parent.equals(node)) {
|
||||||
|
return node;
|
||||||
|
} else {
|
||||||
|
return find(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer pathCompressionFind(Integer node) {
|
||||||
|
DisjointSetInfo setInfo = nodes.get(node);
|
||||||
|
Integer parent = setInfo.getParentNode();
|
||||||
|
if (parent.equals(node)) {
|
||||||
|
return node;
|
||||||
|
} else {
|
||||||
|
Integer parentNode = find(parent);
|
||||||
|
setInfo.setParentNode(parentNode);
|
||||||
|
return parentNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void union(Integer rootU, Integer rootV) {
|
||||||
|
DisjointSetInfo setInfoU = nodes.get(rootU);
|
||||||
|
setInfoU.setParentNode(rootV);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unionByRank(int rootU, int rootV) {
|
||||||
|
DisjointSetInfo setInfoU = nodes.get(rootU);
|
||||||
|
DisjointSetInfo setInfoV = nodes.get(rootV);
|
||||||
|
int rankU = setInfoU.getRank();
|
||||||
|
int rankV = setInfoV.getRank();
|
||||||
|
if (rankU < rankV) {
|
||||||
|
setInfoU.setParentNode(rootV);
|
||||||
|
} else {
|
||||||
|
setInfoV.setParentNode(rootU);
|
||||||
|
if (rankU == rankV) {
|
||||||
|
setInfoU.setRank(rankU + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
package com.baeldung.algorithms.kruskal;
|
||||||
|
|
||||||
|
public class DisjointSetInfo {
|
||||||
|
|
||||||
|
private Integer parentNode;
|
||||||
|
private int rank;
|
||||||
|
|
||||||
|
DisjointSetInfo(Integer nodeNumber) {
|
||||||
|
setParentNode(nodeNumber);
|
||||||
|
setRank(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getParentNode() {
|
||||||
|
return parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentNode(Integer parentNode) {
|
||||||
|
this.parentNode = parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRank() {
|
||||||
|
return rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRank(int rank) {
|
||||||
|
this.rank = rank;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.baeldung.algorithms.kruskal;
|
||||||
|
|
||||||
|
import com.google.common.graph.EndpointPair;
|
||||||
|
import com.google.common.graph.MutableValueGraph;
|
||||||
|
import com.google.common.graph.ValueGraph;
|
||||||
|
import com.google.common.graph.ValueGraphBuilder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class Kruskal {
|
||||||
|
|
||||||
|
public ValueGraph<Integer, Double> minSpanningTree(ValueGraph<Integer, Double> graph) {
|
||||||
|
|
||||||
|
return spanningTree(graph, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueGraph<Integer, Double> maxSpanningTree(ValueGraph<Integer, Double> graph) {
|
||||||
|
return spanningTree(graph, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ValueGraph<Integer, Double> spanningTree(ValueGraph<Integer, Double> graph, boolean minSpanningTree) {
|
||||||
|
Set<EndpointPair<Integer>> edges = graph.edges();
|
||||||
|
List<EndpointPair<Integer>> edgeList = new ArrayList<>(edges);
|
||||||
|
|
||||||
|
if (minSpanningTree) {
|
||||||
|
edgeList.sort(Comparator.comparing(e -> graph.edgeValue(e).get()));
|
||||||
|
} else {
|
||||||
|
edgeList.sort(Collections.reverseOrder(Comparator.comparing(e -> graph.edgeValue(e).get())));
|
||||||
|
}
|
||||||
|
|
||||||
|
int totalNodes = graph.nodes().size();
|
||||||
|
CycleDetector cycleDetector = new CycleDetector(totalNodes);
|
||||||
|
int edgeCount = 0;
|
||||||
|
|
||||||
|
MutableValueGraph<Integer, Double> spanningTree = ValueGraphBuilder.undirected().build();
|
||||||
|
for (EndpointPair<Integer> edge : edgeList) {
|
||||||
|
if (cycleDetector.detectCycle(edge.nodeU(), edge.nodeV())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
spanningTree.putEdgeValue(edge.nodeU(), edge.nodeV(), graph.edgeValue(edge).get());
|
||||||
|
edgeCount++;
|
||||||
|
if (edgeCount == totalNodes - 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return spanningTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.algorithms.minheapmerge;
|
||||||
|
|
||||||
|
public class HeapNode {
|
||||||
|
|
||||||
|
int element;
|
||||||
|
int arrayIndex;
|
||||||
|
int nextElementIndex = 1;
|
||||||
|
|
||||||
|
public HeapNode(int element, int arrayIndex) {
|
||||||
|
this.element = element;
|
||||||
|
this.arrayIndex = arrayIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
package com.baeldung.algorithms.minheapmerge;
|
||||||
|
|
||||||
|
public class MinHeap {
|
||||||
|
|
||||||
|
HeapNode[] heapNodes;
|
||||||
|
|
||||||
|
public MinHeap(HeapNode heapNodes[]) {
|
||||||
|
this.heapNodes = heapNodes;
|
||||||
|
heapifyFromLastLeafsParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
void heapifyFromLastLeafsParent() {
|
||||||
|
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
|
||||||
|
while (lastLeafsParentIndex >= 0) {
|
||||||
|
heapify(lastLeafsParentIndex);
|
||||||
|
lastLeafsParentIndex--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void heapify(int index) {
|
||||||
|
int leftNodeIndex = getLeftNodeIndex(index);
|
||||||
|
int rightNodeIndex = getRightNodeIndex(index);
|
||||||
|
int smallestElementIndex = index;
|
||||||
|
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
|
||||||
|
smallestElementIndex = leftNodeIndex;
|
||||||
|
}
|
||||||
|
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
|
||||||
|
smallestElementIndex = rightNodeIndex;
|
||||||
|
}
|
||||||
|
if (smallestElementIndex != index) {
|
||||||
|
swap(index, smallestElementIndex);
|
||||||
|
heapify(smallestElementIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int getParentNodeIndex(int index) {
|
||||||
|
return (index - 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getLeftNodeIndex(int index) {
|
||||||
|
return (2 * index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getRightNodeIndex(int index) {
|
||||||
|
return (2 * index + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapNode getRootNode() {
|
||||||
|
return heapNodes[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void heapifyFromRoot() {
|
||||||
|
heapify(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void swap(int i, int j) {
|
||||||
|
HeapNode temp = heapNodes[i];
|
||||||
|
heapNodes[i] = heapNodes[j];
|
||||||
|
heapNodes[j] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int[] merge(int[][] array) {
|
||||||
|
HeapNode[] heapNodes = new HeapNode[array.length];
|
||||||
|
int resultingArraySize = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < array.length; i++) {
|
||||||
|
HeapNode node = new HeapNode(array[i][0], i);
|
||||||
|
heapNodes[i] = node;
|
||||||
|
resultingArraySize += array[i].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinHeap minHeap = new MinHeap(heapNodes);
|
||||||
|
int[] resultingArray = new int[resultingArraySize];
|
||||||
|
|
||||||
|
for (int i = 0; i < resultingArraySize; i++) {
|
||||||
|
HeapNode root = minHeap.getRootNode();
|
||||||
|
resultingArray[i] = root.element;
|
||||||
|
|
||||||
|
if (root.nextElementIndex < array[root.arrayIndex].length) {
|
||||||
|
root.element = array[root.arrayIndex][root.nextElementIndex++];
|
||||||
|
} else {
|
||||||
|
root.element = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
minHeap.heapifyFromRoot();
|
||||||
|
}
|
||||||
|
return resultingArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbrackets;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class BalancedBracketsUsingDequeUnitTest {
|
||||||
|
private BalancedBracketsUsingDeque balancedBracketsUsingDeque;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
balancedBracketsUsingDeque = new BalancedBracketsUsingDeque();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced(null);
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("abc[](){}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{[(])}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{{[[(())]]}}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{{([])}}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingDeque.isBalanced("{{)[](}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbrackets;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class BalancedBracketsUsingStringUnitTest {
|
||||||
|
private BalancedBracketsUsingString balancedBracketsUsingString;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
balancedBracketsUsingString = new BalancedBracketsUsingString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced(null);
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("abc[](){}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{[(])}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{[()]}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{{[[(())]]}}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{{([])}}");
|
||||||
|
assertThat(result).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() {
|
||||||
|
boolean result = balancedBracketsUsingString.isBalanced("{{)[](}}");
|
||||||
|
assertThat(result).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+58
@@ -0,0 +1,58 @@
|
|||||||
|
package com.baeldung.algorithms.greedy;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class GreedyAlgorithmUnitTest {
|
||||||
|
|
||||||
|
private SocialConnector prepareNetwork() {
|
||||||
|
SocialConnector sc = new SocialConnector();
|
||||||
|
SocialUser root = new SocialUser("root");
|
||||||
|
SocialUser child1 = new SocialUser("child1");
|
||||||
|
SocialUser child2 = new SocialUser("child2");
|
||||||
|
SocialUser child3 = new SocialUser("child3");
|
||||||
|
SocialUser child21 = new SocialUser("child21");
|
||||||
|
SocialUser child211 = new SocialUser("child211");
|
||||||
|
SocialUser child2111 = new SocialUser("child2111");
|
||||||
|
SocialUser child31 = new SocialUser("child31");
|
||||||
|
SocialUser child311 = new SocialUser("child311");
|
||||||
|
SocialUser child3111 = new SocialUser("child3111");
|
||||||
|
child211.addFollowers(Arrays.asList(new SocialUser[]{child2111}));
|
||||||
|
child311.addFollowers(Arrays.asList(new SocialUser[]{child3111}));
|
||||||
|
child21.addFollowers(Arrays.asList(new SocialUser[]{child211}));
|
||||||
|
child31.addFollowers(Arrays.asList(new SocialUser[]{child311,
|
||||||
|
new SocialUser("child312"), new SocialUser("child313"), new SocialUser("child314")}));
|
||||||
|
child1.addFollowers(Arrays.asList(new SocialUser[]{new SocialUser("child11"), new SocialUser("child12")}));
|
||||||
|
child2.addFollowers(Arrays.asList(new SocialUser[]{child21, new SocialUser("child22"), new SocialUser("child23")}));
|
||||||
|
child3.addFollowers(Arrays.asList(new SocialUser[]{child31}));
|
||||||
|
root.addFollowers(Arrays.asList(new SocialUser[]{child1, child2, child3}));
|
||||||
|
sc.setUsers(Arrays.asList(new SocialUser[]{root, child1, child2, child3, child21, child31, child311, child211}));
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void greedyAlgorithmTest() {
|
||||||
|
GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork());
|
||||||
|
assertEquals(ga.findMostFollowersPath("root"), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void nongreedyAlgorithmTest() {
|
||||||
|
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0);
|
||||||
|
Assertions.assertThrows(IllegalStateException.class, () -> {
|
||||||
|
nga.findMostFollowersPath("root");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void nongreedyAlgorithmUnboundedTest() {
|
||||||
|
SocialConnector sc = prepareNetwork();
|
||||||
|
sc.switchCounter();
|
||||||
|
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0);
|
||||||
|
assertEquals(nga.findMostFollowersPath("root"), 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
package com.baeldung.algorithms.integerstreammedian;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class MedianOfIntegerStreamUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach1() {
|
||||||
|
MedianOfIntegerStream mis = new MedianOfIntegerStream();
|
||||||
|
for (Map.Entry<Integer, Double> e : testcaseFixture().entrySet()) {
|
||||||
|
mis.add(e.getKey());
|
||||||
|
assertEquals(e.getValue(), (Double) mis.getMedian());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach2() {
|
||||||
|
MedianOfIntegerStream2 mis = new MedianOfIntegerStream2();
|
||||||
|
for (Map.Entry<Integer, Double> e : testcaseFixture().entrySet()) {
|
||||||
|
mis.add(e.getKey());
|
||||||
|
assertEquals(e.getValue(), (Double) mis.getMedian());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, Double> testcaseFixture() {
|
||||||
|
return new LinkedHashMap<Integer, Double>() {{
|
||||||
|
put(1, 1d);
|
||||||
|
put(7, 4d);
|
||||||
|
put(5, 5d);
|
||||||
|
put(8, 6d);
|
||||||
|
put(3, 5d);
|
||||||
|
put(9, 6d);
|
||||||
|
put(4, 5d);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
}
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
package com.baeldung.algorithms.kruskal;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import com.google.common.graph.MutableValueGraph;
|
||||||
|
import com.google.common.graph.ValueGraph;
|
||||||
|
import com.google.common.graph.ValueGraphBuilder;
|
||||||
|
import com.baeldung.algorithms.kruskal.Kruskal;
|
||||||
|
|
||||||
|
public class KruskalUnitTest {
|
||||||
|
|
||||||
|
private MutableValueGraph<Integer, Double> graph;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
graph = ValueGraphBuilder.undirected().build();
|
||||||
|
graph.putEdgeValue(0, 1, 8.0);
|
||||||
|
graph.putEdgeValue(0, 2, 5.0);
|
||||||
|
graph.putEdgeValue(1, 2, 9.0);
|
||||||
|
graph.putEdgeValue(1, 3, 11.0);
|
||||||
|
graph.putEdgeValue(2, 3, 15.0);
|
||||||
|
graph.putEdgeValue(2, 4, 10.0);
|
||||||
|
graph.putEdgeValue(3, 4, 7.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenGraph_whenMinimumSpanningTree_thenOutputCorrectResult() {
|
||||||
|
final Kruskal kruskal = new Kruskal();
|
||||||
|
ValueGraph<Integer, Double> spanningTree = kruskal.minSpanningTree(graph);
|
||||||
|
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(0, 1));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(0, 2));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(2, 4));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(3, 4));
|
||||||
|
assertEquals(graph.edgeValue(0, 1), spanningTree.edgeValue(0, 1));
|
||||||
|
assertEquals(graph.edgeValue(0, 2), spanningTree.edgeValue(0, 2));
|
||||||
|
assertEquals(graph.edgeValue(2, 4), spanningTree.edgeValue(2, 4));
|
||||||
|
assertEquals(graph.edgeValue(3, 4), spanningTree.edgeValue(3, 4));
|
||||||
|
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(1, 2));
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(1, 3));
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(2, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenGraph_whenMaximumSpanningTree_thenOutputCorrectResult() {
|
||||||
|
final Kruskal kruskal = new Kruskal();
|
||||||
|
ValueGraph<Integer, Double> spanningTree = kruskal.maxSpanningTree(graph);
|
||||||
|
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(0, 1));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(1, 3));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(2, 3));
|
||||||
|
assertTrue(spanningTree.hasEdgeConnecting(2, 4));
|
||||||
|
assertEquals(graph.edgeValue(0, 1), spanningTree.edgeValue(0, 1));
|
||||||
|
assertEquals(graph.edgeValue(1, 3), spanningTree.edgeValue(1, 3));
|
||||||
|
assertEquals(graph.edgeValue(2, 3), spanningTree.edgeValue(2, 3));
|
||||||
|
assertEquals(graph.edgeValue(2, 4), spanningTree.edgeValue(2, 4));
|
||||||
|
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(0, 2));
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(1, 2));
|
||||||
|
assertFalse(spanningTree.hasEdgeConnecting(3, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user