commit
659cdfece1
1
.gitignore
vendored
1
.gitignore
vendored
@ -65,6 +65,7 @@ core-java-io/target_link.txt
|
|||||||
core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF
|
core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF
|
||||||
ethereum/logs/
|
ethereum/logs/
|
||||||
jmeter/src/main/resources/*-JMeter.csv
|
jmeter/src/main/resources/*-JMeter.csv
|
||||||
|
ninja/devDb.mv.db
|
||||||
|
|
||||||
**/node_modules/
|
**/node_modules/
|
||||||
**/dist
|
**/dist
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>
|
@ -12,4 +12,12 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||||||
- [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)
|
- [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)
|
- [Overview of Combinatorial Problems in Java](https://www.baeldung.com/java-combinatorial-algorithms)
|
||||||
|
- [Prim’s Algorithm](https://www.baeldung.com/java-prim-algorithm)
|
||||||
|
- [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray)
|
||||||
|
- [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays)
|
||||||
|
- [Median of Stream of Integers using Heap](https://www.baeldung.com/java-stream-integers-median-using-heap)
|
||||||
|
- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
|
||||||
|
- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
|
||||||
|
- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
|
||||||
|
- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
|
||||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>28.1-jre</version>
|
<version>${guava.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -65,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>
|
@ -0,0 +1,141 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
public class AVLTree {
|
||||||
|
|
||||||
|
public class Node {
|
||||||
|
int key;
|
||||||
|
int height;
|
||||||
|
Node left;
|
||||||
|
Node right;
|
||||||
|
|
||||||
|
Node(int key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node root;
|
||||||
|
|
||||||
|
public Node find(int key) {
|
||||||
|
Node current = root;
|
||||||
|
while (current != null) {
|
||||||
|
if (current.key == key) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
current = current.key < key ? current.right : current.left;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insert(int key) {
|
||||||
|
root = insert(root, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(int key) {
|
||||||
|
root = delete(root, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node getRoot() {
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int height() {
|
||||||
|
return root == null ? -1 : root.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node insert(Node node, int key) {
|
||||||
|
if (node == null) {
|
||||||
|
return new Node(key);
|
||||||
|
} else if (node.key > key) {
|
||||||
|
node.left = insert(node.left, key);
|
||||||
|
} else if (node.key < key) {
|
||||||
|
node.right = insert(node.right, key);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("duplicate Key!");
|
||||||
|
}
|
||||||
|
return rebalance(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node delete(Node node, int key) {
|
||||||
|
if (node == null) {
|
||||||
|
return node;
|
||||||
|
} else if (node.key > key) {
|
||||||
|
node.left = delete(node.left, key);
|
||||||
|
} else if (node.key < key) {
|
||||||
|
node.right = delete(node.right, key);
|
||||||
|
} else {
|
||||||
|
if (node.left == null || node.right == null) {
|
||||||
|
node = (node.left == null) ? node.right : node.left;
|
||||||
|
} else {
|
||||||
|
Node mostLeftChild = mostLeftChild(node.right);
|
||||||
|
node.key = mostLeftChild.key;
|
||||||
|
node.right = delete(node.right, node.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (node != null) {
|
||||||
|
node = rebalance(node);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node mostLeftChild(Node node) {
|
||||||
|
Node current = node;
|
||||||
|
/* loop down to find the leftmost leaf */
|
||||||
|
while (current.left != null) {
|
||||||
|
current = current.left;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node rebalance(Node z) {
|
||||||
|
updateHeight(z);
|
||||||
|
int balance = getBalance(z);
|
||||||
|
if (balance > 1) {
|
||||||
|
if (height(z.right.right) > height(z.right.left)) {
|
||||||
|
z = rotateLeft(z);
|
||||||
|
} else {
|
||||||
|
z.right = rotateRight(z.right);
|
||||||
|
z = rotateLeft(z);
|
||||||
|
}
|
||||||
|
} else if (balance < -1) {
|
||||||
|
if (height(z.left.left) > height(z.left.right)) {
|
||||||
|
z = rotateRight(z);
|
||||||
|
} else {
|
||||||
|
z.left = rotateLeft(z.left);
|
||||||
|
z = rotateRight(z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node rotateRight(Node y) {
|
||||||
|
Node x = y.left;
|
||||||
|
Node z = x.right;
|
||||||
|
x.right = y;
|
||||||
|
y.left = z;
|
||||||
|
updateHeight(y);
|
||||||
|
updateHeight(x);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node rotateLeft(Node y) {
|
||||||
|
Node x = y.right;
|
||||||
|
Node z = x.left;
|
||||||
|
x.left = y;
|
||||||
|
y.right = z;
|
||||||
|
updateHeight(y);
|
||||||
|
updateHeight(x);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateHeight(Node n) {
|
||||||
|
n.height = 1 + Math.max(height(n.left), height(n.right));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int height(Node n) {
|
||||||
|
return n == null ? -1 : n.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBalance(Node n) {
|
||||||
|
return (n == null) ? 0 : height(n.right) - height(n.left);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -15,7 +15,7 @@ public class GreedyAlgorithm {
|
|||||||
this.fp = new FollowersPath();
|
this.fp = new FollowersPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
public long findMostFollowersPath(String account) throws Exception {
|
public long findMostFollowersPath(String account) {
|
||||||
long max = 0;
|
long max = 0;
|
||||||
SocialUser toFollow = null;
|
SocialUser toFollow = null;
|
||||||
|
|
||||||
@ -31,12 +31,8 @@ public class GreedyAlgorithm {
|
|||||||
if (currentLevel < maxLevel - 1) {
|
if (currentLevel < maxLevel - 1) {
|
||||||
currentLevel++;
|
currentLevel++;
|
||||||
max += findMostFollowersPath(toFollow.getUsername());
|
max += findMostFollowersPath(toFollow.getUsername());
|
||||||
//fp.addFollower(toFollow.getUsername(), max);
|
|
||||||
//fp.addCount(max);
|
|
||||||
return max;
|
return max;
|
||||||
} else {
|
} else {
|
||||||
//fp.addFollower(toFollow.getUsername(), max);
|
|
||||||
//fp.addCount(max);
|
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,8 @@ public class NonGreedyAlgorithm {
|
|||||||
this.tc = tc;
|
this.tc = tc;
|
||||||
this.currentLevel = level;
|
this.currentLevel = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long findMostFollowersPath(String account) {
|
||||||
public long findMostFollowersPath(String account) throws Exception {
|
|
||||||
List<SocialUser> followers = tc.getFollowers(account);
|
List<SocialUser> followers = tc.getFollowers(account);
|
||||||
long total = currentLevel > 0 ? followers.size() : 0;
|
long total = currentLevel > 0 ? followers.size() : 0;
|
||||||
|
|
||||||
|
@ -20,9 +20,9 @@ public class SocialConnector {
|
|||||||
return this.isCounterEnabled;
|
return this.isCounterEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SocialUser> getFollowers(String account) throws Exception {
|
public List<SocialUser> getFollowers(String account) {
|
||||||
if (counter < 0)
|
if (counter < 0)
|
||||||
throw new Exception ("API limit reached");
|
throw new IllegalStateException ("API limit reached");
|
||||||
else {
|
else {
|
||||||
if(this.isCounterEnabled) counter--;
|
if(this.isCounterEnabled) counter--;
|
||||||
for(SocialUser user : users) {
|
for(SocialUser user : users) {
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package com.baeldung.algorithms.balancedbinarytree;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class AVLTreeUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyTree_whenHeightCalled_shouldReturnMinus1() {
|
||||||
|
AVLTree tree = new AVLTree();
|
||||||
|
Assert.assertEquals(-1, tree.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyTree_whenInsertCalled_heightShouldBeZero() {
|
||||||
|
AVLTree tree = new AVLTree();
|
||||||
|
tree.insert(1);
|
||||||
|
Assert.assertEquals(0, tree.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyTree_whenInsertCalled_treeShouldBeAvl() {
|
||||||
|
AVLTree tree = new AVLTree();
|
||||||
|
tree.insert(1);
|
||||||
|
Assert.assertTrue(isAVL(tree));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSampleTree_whenInsertCalled_treeShouldBeAvl() {
|
||||||
|
AVLTree tree = getSampleAVLTree();
|
||||||
|
int newKey = 11;
|
||||||
|
tree.insert(newKey);
|
||||||
|
Assert.assertTrue(isAVL(tree));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSampleTree_whenFindExistingKeyCalled_shouldReturnMatchedNode() {
|
||||||
|
AVLTree tree = getSampleAVLTree();
|
||||||
|
int existingKey = 2;
|
||||||
|
AVLTree.Node result = tree.find(existingKey);
|
||||||
|
Assert.assertEquals(result.key, existingKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSampleTree_whenFindNotExistingKeyCalled_shouldReturnNull() {
|
||||||
|
AVLTree tree = getSampleAVLTree();
|
||||||
|
int notExistingKey = 11;
|
||||||
|
AVLTree.Node result = tree.find(notExistingKey);
|
||||||
|
Assert.assertNull(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyTree_whenDeleteCalled_treeShouldBeAvl() {
|
||||||
|
AVLTree tree = new AVLTree();
|
||||||
|
tree.delete(1);
|
||||||
|
Assert.assertTrue(isAVL(tree));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSampleTree_whenDeleteCalled_treeShouldBeAvl() {
|
||||||
|
AVLTree tree = getSampleAVLTree();
|
||||||
|
tree.delete(1);
|
||||||
|
Assert.assertTrue(isAVL(tree, tree.getRoot()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAVL(AVLTree tree) {
|
||||||
|
return isAVL(tree, tree.getRoot());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAVL(AVLTree tree, AVLTree.Node node) {
|
||||||
|
if ( node == null )
|
||||||
|
return true;
|
||||||
|
int balance = tree.getBalance(node);
|
||||||
|
return (balance <= 1 && balance >= -1) && isAVL(tree, node.left) && isAVL(tree, node.right);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AVLTree getSampleAVLTree() {
|
||||||
|
AVLTree avlTree = new AVLTree();
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
avlTree.insert(i);
|
||||||
|
return avlTree;
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,21 +35,21 @@ public class GreedyAlgorithmUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void greedyAlgorithmTest() throws Exception {
|
public void greedyAlgorithmTest() {
|
||||||
GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork());
|
GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork());
|
||||||
assertEquals(ga.findMostFollowersPath("root"), 5);
|
assertEquals(ga.findMostFollowersPath("root"), 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void nongreedyAlgorithmTest() throws Exception {
|
public void nongreedyAlgorithmTest() {
|
||||||
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0);
|
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0);
|
||||||
Assertions.assertThrows(Exception.class, () -> {
|
Assertions.assertThrows(IllegalStateException.class, () -> {
|
||||||
nga.findMostFollowersPath("root");
|
nga.findMostFollowersPath("root");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void nongreedyAlgorithmUnboundedTest() throws Exception {
|
public void nongreedyAlgorithmUnboundedTest() {
|
||||||
SocialConnector sc = prepareNetwork();
|
SocialConnector sc = prepareNetwork();
|
||||||
sc.switchCounter();
|
sc.switchCounter();
|
||||||
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0);
|
NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0);
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.algorithms.minheapmerge;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class MinHeapUnitTest {
|
||||||
|
|
||||||
|
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
|
||||||
|
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
|
||||||
|
int[] resultArray = MinHeap.merge(inputArray);
|
||||||
|
|
||||||
|
assertThat(resultArray.length, is(equalTo(10)));
|
||||||
|
assertThat(resultArray, is(equalTo(expectedArray)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
algorithms-sorting-2/.gitignore
vendored
Normal file
4
algorithms-sorting-2/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
.settings/
|
||||||
|
.classpath
|
||||||
|
.project
|
3
algorithms-sorting-2/README.md
Normal file
3
algorithms-sorting-2/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [Partitioning and Sorting Arrays with Many Repeated Entries](https://www.baeldung.com/java-sorting-arrays-with-repeated-entries)
|
64
algorithms-sorting-2/pom.xml
Normal file
64
algorithms-sorting-2/pom.xml
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
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-sorting-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>algorithms-sorting-2</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>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>${junit-jupiter-api.version}</version>
|
||||||
|
<scope>test</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>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<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>
|
||||||
|
<junit-jupiter-api.version>5.3.1</junit-jupiter-api.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,66 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
import static com.baeldung.algorithms.quicksort.SortingUtils.swap;
|
||||||
|
|
||||||
|
public class BentleyMcIlroyPartioning {
|
||||||
|
|
||||||
|
public static Partition partition(int input[], int begin, int end) {
|
||||||
|
int left = begin, right = end;
|
||||||
|
int leftEqualKeysCount = 0, rightEqualKeysCount = 0;
|
||||||
|
|
||||||
|
int partitioningValue = input[end];
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
while (input[left] < partitioningValue)
|
||||||
|
left++;
|
||||||
|
|
||||||
|
while (input[right] > partitioningValue) {
|
||||||
|
if (right == begin)
|
||||||
|
break;
|
||||||
|
right--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left == right && input[left] == partitioningValue) {
|
||||||
|
swap(input, begin + leftEqualKeysCount, left);
|
||||||
|
leftEqualKeysCount++;
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left >= right) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
swap(input, left, right);
|
||||||
|
|
||||||
|
if (input[left] == partitioningValue) {
|
||||||
|
swap(input, begin + leftEqualKeysCount, left);
|
||||||
|
leftEqualKeysCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input[right] == partitioningValue) {
|
||||||
|
swap(input, right, end - rightEqualKeysCount);
|
||||||
|
rightEqualKeysCount++;
|
||||||
|
}
|
||||||
|
left++; right--;
|
||||||
|
}
|
||||||
|
right = left - 1;
|
||||||
|
for (int k = begin; k < begin + leftEqualKeysCount; k++, right--) {
|
||||||
|
if (right >= begin + leftEqualKeysCount)
|
||||||
|
swap(input, k, right);
|
||||||
|
}
|
||||||
|
for (int k = end; k > end - rightEqualKeysCount; k--, left++) {
|
||||||
|
if (left <= end - rightEqualKeysCount)
|
||||||
|
swap(input, left, k);
|
||||||
|
}
|
||||||
|
return new Partition(right + 1, left - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void quicksort(int input[], int begin, int end) {
|
||||||
|
if (end <= begin)
|
||||||
|
return;
|
||||||
|
Partition middlePartition = partition(input, begin, end);
|
||||||
|
quicksort(input, begin, middlePartition.getLeft() - 1);
|
||||||
|
quicksort(input, middlePartition.getRight() + 1, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
import static com.baeldung.algorithms.quicksort.SortingUtils.compare;
|
||||||
|
import static com.baeldung.algorithms.quicksort.SortingUtils.swap;
|
||||||
|
|
||||||
|
public class DutchNationalFlagPartioning {
|
||||||
|
|
||||||
|
public static Partition partition(int[] a, int begin, int end) {
|
||||||
|
int lt = begin, current = begin, gt = end;
|
||||||
|
int partitioningValue = a[begin];
|
||||||
|
|
||||||
|
while (current <= gt) {
|
||||||
|
int compareCurrent = compare(a[current], partitioningValue);
|
||||||
|
switch (compareCurrent) {
|
||||||
|
case -1:
|
||||||
|
swap(a, current++, lt++);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
current++;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
swap(a, current, gt--);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Partition(lt, gt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void quicksort(int[] input, int begin, int end) {
|
||||||
|
if (end <= begin)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Partition middlePartition = partition(input, begin, end);
|
||||||
|
|
||||||
|
quicksort(input, begin, middlePartition.getLeft() - 1);
|
||||||
|
quicksort(input, middlePartition.getRight() + 1, end);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
public class Partition {
|
||||||
|
private int left;
|
||||||
|
private int right;
|
||||||
|
|
||||||
|
public Partition(int left, int right) {
|
||||||
|
super();
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLeft() {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLeft(int left) {
|
||||||
|
this.left = left;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRight() {
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRight(int right) {
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
public class SortingUtils {
|
||||||
|
|
||||||
|
public static void swap(int[] array, int position1, int position2) {
|
||||||
|
if (position1 != position2) {
|
||||||
|
int temp = array[position1];
|
||||||
|
array[position1] = array[position2];
|
||||||
|
array[position2] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int compare(int num1, int num2) {
|
||||||
|
if (num1 > num2)
|
||||||
|
return 1;
|
||||||
|
else if (num1 < num2)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printArray(int[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int e : array) {
|
||||||
|
System.out.print(e + " ");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
algorithms-sorting-2/src/main/resources/logback.xml
Normal file
13
algorithms-sorting-2/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,16 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class BentleyMcilroyPartitioningUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void given_IntegerArray_whenSortedWithBentleyMcilroyPartitioning_thenGetSortedArray() {
|
||||||
|
int[] actual = {3, 2, 2, 2, 3, 7, 7, 3, 2, 2, 7, 3, 3};
|
||||||
|
int[] expected = {2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 7, 7, 7};
|
||||||
|
BentleyMcIlroyPartioning.quicksort(actual, 0, actual.length - 1);
|
||||||
|
Assert.assertArrayEquals(expected, actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.algorithms.quicksort;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class DNFThreeWayQuickSortUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntegerArray_whenSortedWithThreeWayQuickSort_thenGetSortedArray() {
|
||||||
|
int[] actual = {3, 5, 5, 5, 3, 7, 7, 3, 5, 5, 7, 3, 3};
|
||||||
|
int[] expected = {3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 7, 7, 7};
|
||||||
|
DutchNationalFlagPartioning.quicksort(actual, 0, actual.length - 1);
|
||||||
|
Assert.assertArrayEquals(expected, actual);
|
||||||
|
}
|
||||||
|
}
|
@ -18,19 +18,19 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.ws.rs</groupId>
|
<groupId>javax.ws.rs</groupId>
|
||||||
<artifactId>javax.ws.rs-api</artifactId>
|
<artifactId>javax.ws.rs-api</artifactId>
|
||||||
<version>2.1</version>
|
<version>${rs-api.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.enterprise</groupId>
|
<groupId>javax.enterprise</groupId>
|
||||||
<artifactId>cdi-api</artifactId>
|
<artifactId>cdi-api</artifactId>
|
||||||
<version>2.0</version>
|
<version>${cdi-api.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.json.bind</groupId>
|
<groupId>javax.json.bind</groupId>
|
||||||
<artifactId>javax.json.bind-api</artifactId>
|
<artifactId>javax.json.bind-api</artifactId>
|
||||||
<version>1.0</version>
|
<version>${bind-api.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -80,6 +80,9 @@
|
|||||||
<liberty-maven-plugin.version>2.4.2</liberty-maven-plugin.version>
|
<liberty-maven-plugin.version>2.4.2</liberty-maven-plugin.version>
|
||||||
<failOnMissingWebXml>false</failOnMissingWebXml>
|
<failOnMissingWebXml>false</failOnMissingWebXml>
|
||||||
<openliberty-version>18.0.0.2</openliberty-version>
|
<openliberty-version>18.0.0.2</openliberty-version>
|
||||||
|
<rs-api.version>2.1</rs-api.version>
|
||||||
|
<cdi-api.version>2.0</cdi-api.version>
|
||||||
|
<bind-api.version>1.0</bind-api.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -6,3 +6,6 @@ This module contains articles about Apache POI
|
|||||||
- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi)
|
- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi)
|
||||||
- [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel)
|
- [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel)
|
||||||
- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow)
|
- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow)
|
||||||
|
- [Merge Cells in Excel Using Apache POI](https://www.baeldung.com/java-apache-poi-merge-cells)
|
||||||
|
- [Get String Value of Excel Cell with Apache POI](https://www.baeldung.com/java-apache-poi-cell-string-value)
|
||||||
|
- [Read Excel Cell Value Rather Than Formula With Apache POI](https://github.com/eugenp/tutorials/tree/master/apache-poi)
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<poi.version>3.15</poi.version>
|
<poi.version>4.1.1</poi.version>
|
||||||
<jexcel.version>1.0.6</jexcel.version>
|
<jexcel.version>1.0.6</jexcel.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.poi.excel;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormatter;
|
||||||
|
import org.apache.poi.ss.usermodel.FormulaEvaluator;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
public class ExcelCellFormatter {
|
||||||
|
|
||||||
|
public String getCellStringValue(Cell cell) {
|
||||||
|
DataFormatter formatter = new DataFormatter();
|
||||||
|
return formatter.formatCellValue(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCellStringValueWithFormula(Cell cell, Workbook workbook) {
|
||||||
|
DataFormatter formatter = new DataFormatter();
|
||||||
|
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
|
||||||
|
return formatter.formatCellValue(cell, evaluator);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package com.baeldung.poi.excel.read.cellvalueandnotformula;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.CellType;
|
||||||
|
import org.apache.poi.ss.usermodel.FormulaEvaluator;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.ss.util.CellAddress;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
public class CellValueAndNotFormulaHelper {
|
||||||
|
|
||||||
|
public Object getCellValueByFetchingLastCachedValue(String fileLocation, String cellLocation) throws IOException {
|
||||||
|
Object cellValue = new Object();
|
||||||
|
|
||||||
|
FileInputStream inputStream = new FileInputStream(new File(fileLocation));
|
||||||
|
Workbook workbook = new XSSFWorkbook(inputStream);
|
||||||
|
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
CellAddress cellAddress = new CellAddress(cellLocation);
|
||||||
|
Row row = sheet.getRow(cellAddress.getRow());
|
||||||
|
Cell cell = row.getCell(cellAddress.getColumn());
|
||||||
|
|
||||||
|
if (cell.getCellType() == CellType.FORMULA) {
|
||||||
|
switch (cell.getCachedFormulaResultType()) {
|
||||||
|
case BOOLEAN:
|
||||||
|
cellValue = cell.getBooleanCellValue();
|
||||||
|
break;
|
||||||
|
case NUMERIC:
|
||||||
|
cellValue = cell.getNumericCellValue();
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
cellValue = cell.getStringCellValue();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cellValue = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
workbook.close();
|
||||||
|
return cellValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getCellValueByEvaluatingFormula(String fileLocation, String cellLocation) throws IOException {
|
||||||
|
Object cellValue = new Object();
|
||||||
|
|
||||||
|
FileInputStream inputStream = new FileInputStream(new File(fileLocation));
|
||||||
|
Workbook workbook = new XSSFWorkbook(inputStream);
|
||||||
|
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
FormulaEvaluator evaluator = workbook.getCreationHelper()
|
||||||
|
.createFormulaEvaluator();
|
||||||
|
|
||||||
|
CellAddress cellAddress = new CellAddress(cellLocation);
|
||||||
|
Row row = sheet.getRow(cellAddress.getRow());
|
||||||
|
Cell cell = row.getCell(cellAddress.getColumn());
|
||||||
|
|
||||||
|
if (cell.getCellType() == CellType.FORMULA) {
|
||||||
|
switch (evaluator.evaluateFormulaCell(cell)) {
|
||||||
|
case BOOLEAN:
|
||||||
|
cellValue = cell.getBooleanCellValue();
|
||||||
|
break;
|
||||||
|
case NUMERIC:
|
||||||
|
cellValue = cell.getNumericCellValue();
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
cellValue = cell.getStringCellValue();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cellValue = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
workbook.close();
|
||||||
|
return cellValue;
|
||||||
|
}
|
||||||
|
}
|
BIN
apache-poi/src/main/resources/ExcelCellFormatterTest.xlsx
Normal file
BIN
apache-poi/src/main/resources/ExcelCellFormatterTest.xlsx
Normal file
Binary file not shown.
BIN
apache-poi/src/main/resources/test.xlsx
Normal file
BIN
apache-poi/src/main/resources/test.xlsx
Normal file
Binary file not shown.
@ -0,0 +1,87 @@
|
|||||||
|
package com.baeldung.poi.excel;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ExcelCellFormatterUnitTest {
|
||||||
|
private static final String FILE_NAME = "ExcelCellFormatterTest.xlsx";
|
||||||
|
private static final int STRING_CELL_INDEX = 0;
|
||||||
|
private static final int BOOLEAN_CELL_INDEX = 1;
|
||||||
|
private static final int RAW_NUMERIC_CELL_INDEX = 2;
|
||||||
|
private static final int FORMATTED_NUMERIC_CELL_INDEX = 3;
|
||||||
|
private static final int FORMULA_CELL_INDEX = 4;
|
||||||
|
|
||||||
|
private String fileLocation;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws IOException, URISyntaxException {
|
||||||
|
fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStringCell_whenGetCellStringValue_thenReturnStringValue() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
Row row = sheet.getRow(0);
|
||||||
|
|
||||||
|
ExcelCellFormatter formatter = new ExcelCellFormatter();
|
||||||
|
assertEquals("String Test", formatter.getCellStringValue(row.getCell(STRING_CELL_INDEX)));
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBooleanCell_whenGetCellStringValue_thenReturnBooleanStringValue() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
Row row = sheet.getRow(0);
|
||||||
|
|
||||||
|
ExcelCellFormatter formatter = new ExcelCellFormatter();
|
||||||
|
assertEquals("TRUE", formatter.getCellStringValue(row.getCell(BOOLEAN_CELL_INDEX)));
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNumericCell_whenGetCellStringValue_thenReturnNumericStringValue() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
Row row = sheet.getRow(0);
|
||||||
|
|
||||||
|
ExcelCellFormatter formatter = new ExcelCellFormatter();
|
||||||
|
assertEquals("1.234", formatter.getCellStringValue(row.getCell(RAW_NUMERIC_CELL_INDEX)));
|
||||||
|
assertEquals("1.23", formatter.getCellStringValue(row.getCell(FORMATTED_NUMERIC_CELL_INDEX)));
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenFormualCell_whenGetCellStringValue_thenReturnOriginalFormulaString() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
Row row = sheet.getRow(0);
|
||||||
|
|
||||||
|
ExcelCellFormatter formatter = new ExcelCellFormatter();
|
||||||
|
assertEquals("SUM(1+2)", formatter.getCellStringValue(row.getCell(FORMULA_CELL_INDEX)));
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenFormualCell_whenGetCellStringValueForFormula_thenReturnOriginalFormulatring() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
Row row = sheet.getRow(0);
|
||||||
|
|
||||||
|
ExcelCellFormatter formatter = new ExcelCellFormatter();
|
||||||
|
assertEquals("3", formatter.getCellStringValueWithFormula(row.getCell(FORMULA_CELL_INDEX), workbook));
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.baeldung.poi.excel.merge;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ExcelCellMergerUnitTest {
|
||||||
|
private static final String FILE_NAME = "ExcelCellFormatterTest.xlsx";
|
||||||
|
private String fileLocation;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws IOException, URISyntaxException {
|
||||||
|
fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCellIndex_whenAddMergeRegion_thenMergeRegionCreated() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
assertEquals(0, sheet.getNumMergedRegions());
|
||||||
|
int firstRow = 0;
|
||||||
|
int lastRow = 0;
|
||||||
|
int firstCol = 0;
|
||||||
|
int lastCol = 2;
|
||||||
|
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
|
||||||
|
assertEquals(1, sheet.getNumMergedRegions());
|
||||||
|
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCellRefString_whenAddMergeRegion_thenMergeRegionCreated() throws IOException {
|
||||||
|
Workbook workbook = new XSSFWorkbook(fileLocation);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
assertEquals(0, sheet.getNumMergedRegions());
|
||||||
|
sheet.addMergedRegion(CellRangeAddress.valueOf("A1:C1"));
|
||||||
|
assertEquals(1, sheet.getNumMergedRegions());
|
||||||
|
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.poi.excel.read.cellvalueandnotformula;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CellValueAndNotFormulaUnitTest {
|
||||||
|
|
||||||
|
private CellValueAndNotFormulaHelper readCellValueAndNotFormulaHelper;
|
||||||
|
private String fileLocation;
|
||||||
|
private static final String FILE_NAME = "test.xlsx";
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws URISyntaxException {
|
||||||
|
fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
|
||||||
|
readCellValueAndNotFormulaHelper = new CellValueAndNotFormulaHelper();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenExcelCell_whenReadCellValueByLastCachedValue_thenProduceCorrectResult() throws IOException {
|
||||||
|
final double expectedResult = 7.0;
|
||||||
|
final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByFetchingLastCachedValue(fileLocation, "C2");
|
||||||
|
|
||||||
|
assertEquals(expectedResult, cellValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenExcelCell_whenReadCellValueByEvaluatingFormula_thenProduceCorrectResult() throws IOException {
|
||||||
|
final double expectedResult = 7.0;
|
||||||
|
final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByEvaluatingFormula(fileLocation, "C2");
|
||||||
|
|
||||||
|
assertEquals(expectedResult, cellValue);
|
||||||
|
}
|
||||||
|
}
|
7
apache-rocketmq/README.md
Normal file
7
apache-rocketmq/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
## Apache RocketMQ
|
||||||
|
|
||||||
|
This module contains articles about Apache RocketMQ
|
||||||
|
|
||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [Apache RocketMQ with Spring Boot](https://www.baeldung.com/apache-rocketmq-spring-boot)
|
28
apache-rocketmq/pom.xml
Normal file
28
apache-rocketmq/pom.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>apache-rocketmq</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<name>apache-rocketmq</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.rocketmq</groupId>
|
||||||
|
<artifactId>rocketmq-spring-boot-starter</artifactId>
|
||||||
|
<version>${rocketmq.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<geode.core>1.6.0</geode.core>
|
||||||
|
<rocketmq.version>2.0.4</rocketmq.version>
|
||||||
|
</properties>
|
||||||
|
</project>
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.baeldung.rocketmq.consumer;
|
||||||
|
|
||||||
|
import com.baeldung.rocketmq.event.CartItemEvent;
|
||||||
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class CartEventConsumer {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(CartEventConsumer.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RocketMQMessageListener(topic = "cart-item-add-topic", consumerGroup = "cart-consumer_cart-item-add-topic")
|
||||||
|
public class CardItemAddConsumer implements RocketMQListener<CartItemEvent> {
|
||||||
|
public void onMessage(CartItemEvent addItemEvent) {
|
||||||
|
System.out.println("Adding item: " + addItemEvent);
|
||||||
|
// logic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RocketMQMessageListener(topic = "cart-item-removed-topic", consumerGroup = "cart-consumer_cart-item-removed-topic")
|
||||||
|
public class CardItemRemoveConsumer implements RocketMQListener<CartItemEvent> {
|
||||||
|
public void onMessage(CartItemEvent removeItemEvent) {
|
||||||
|
System.out.println("Removing item: " + removeItemEvent);
|
||||||
|
// logic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.rocketmq.event;
|
||||||
|
|
||||||
|
public class CartItemEvent {
|
||||||
|
private String itemId;
|
||||||
|
private int quantity;
|
||||||
|
|
||||||
|
public CartItemEvent(String itemId, int quantity) {
|
||||||
|
this.itemId = itemId;
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getItemId() {
|
||||||
|
return itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItemId(String itemId) {
|
||||||
|
this.itemId = itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getQuantity() {
|
||||||
|
return quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuantity(int quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "CartItemEvent{" + "itemId='" + itemId + '\'' + ", quantity=" + quantity + '}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.baeldung.rocketmq.producer;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.rocketmq.event.CartItemEvent;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.CommandLineRunner;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class CartEventProducer implements CommandLineRunner {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RocketMQTemplate rocketMQTemplate;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(CartEventProducer.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(String... args) throws Exception {
|
||||||
|
rocketMQTemplate.convertAndSend("cart-item-add-topic", new CartItemEvent("bike", 1));
|
||||||
|
rocketMQTemplate.convertAndSend("cart-item-add-topic", new CartItemEvent("computer", 2));
|
||||||
|
rocketMQTemplate.convertAndSend("cart-item-removed-topic", new CartItemEvent("bike", 1));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.rocketmq.transaction;
|
||||||
|
|
||||||
|
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
|
||||||
|
import org.springframework.messaging.Message;
|
||||||
|
|
||||||
|
@RocketMQTransactionListener(txProducerGroup = "test-transaction")
|
||||||
|
class TransactionListenerImpl implements RocketMQLocalTransactionListener {
|
||||||
|
@Override
|
||||||
|
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
|
||||||
|
// ... local transaction process, return ROLLBACK, COMMIT or UNKNOWN
|
||||||
|
return RocketMQLocalTransactionState.UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
|
||||||
|
// ... check transaction status and return ROLLBACK, COMMIT or UNKNOWN
|
||||||
|
return RocketMQLocalTransactionState.COMMIT;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
rocketmq.name-server=127.0.0.1:9876
|
||||||
|
rocketmq.producer.group=my-group
|
||||||
|
rocketmq.producer.send-message-timeout=300000
|
||||||
|
rocketmq.producer.compress-message-body-threshold=4096
|
||||||
|
rocketmq.producer.max-message-size=4194304
|
||||||
|
rocketmq.producer.retry-times-when-send-async-failed=0
|
||||||
|
rocketmq.producer.retry-next-server=true
|
||||||
|
rocketmq.producer.retry-times-when-send-failed=2
|
||||||
|
|
@ -7,4 +7,4 @@ This module contains articles about Apache Spark
|
|||||||
- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark)
|
- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark)
|
||||||
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
|
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
|
||||||
- [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning)
|
- [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning)
|
||||||
|
- [Introduction to Spark Graph Processing with GraphFrames](https://www.baeldung.com/spark-graph-graphframes)
|
||||||
|
3
apache-tapestry/README.md
Normal file
3
apache-tapestry/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
### Relevant Articles
|
||||||
|
|
||||||
|
- [Intro to Apache Tapestry](https://www.baeldung.com/apache-tapestry)
|
@ -81,10 +81,10 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>2.3.2</version>
|
<version>${compiler.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.8</source>
|
<source>${source.version}</source>
|
||||||
<target>1.8</target>
|
<target>${target.version}</target>
|
||||||
<optimize>true</optimize>
|
<optimize>true</optimize>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
@ -92,7 +92,7 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.7.2</version>
|
<version>${compiler.surefire.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<systemPropertyVariables>
|
<systemPropertyVariables>
|
||||||
<tapestry.execution-mode>Qa</tapestry.execution-mode>
|
<tapestry.execution-mode>Qa</tapestry.execution-mode>
|
||||||
@ -104,7 +104,7 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
<artifactId>maven-jetty-plugin</artifactId>
|
<artifactId>maven-jetty-plugin</artifactId>
|
||||||
<version>6.1.16</version>
|
<version>${compiler.jetty.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- Log to the console. -->
|
<!-- Log to the console. -->
|
||||||
<requestLog implementation="org.mortbay.jetty.NCSARequestLog">
|
<requestLog implementation="org.mortbay.jetty.NCSARequestLog">
|
||||||
@ -140,6 +140,11 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's
|
|||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
<compiler.jetty.version>6.1.16</compiler.jetty.version>
|
||||||
|
<compiler.surefire.version>2.7.2</compiler.surefire.version>
|
||||||
|
<compiler.plugin.version>2.3.2</compiler.plugin.version>
|
||||||
|
<source.version>1.8</source.version>
|
||||||
|
<target.version>1.8</target.version>
|
||||||
<tapestry-release-version>5.4.5</tapestry-release-version>
|
<tapestry-release-version>5.4.5</tapestry-release-version>
|
||||||
<servlet-api-release-version>2.5</servlet-api-release-version>
|
<servlet-api-release-version>2.5</servlet-api-release-version>
|
||||||
<testng-release-version>6.8.21</testng-release-version>
|
<testng-release-version>6.8.21</testng-release-version>
|
||||||
|
3
aws-reactive/README.md
Normal file
3
aws-reactive/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [AWS S3 with Java – Reactive Support](https://www.baeldung.com/java-aws-s3-reactive)
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
|
<spring.version>2.2.1.RELEASE</spring.version>
|
||||||
|
<awssdk.version>2.10.27</awssdk.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
@ -26,7 +28,7 @@
|
|||||||
<!-- Import dependency management from Spring Boot -->
|
<!-- Import dependency management from Spring Boot -->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
<version>2.2.1.RELEASE</version>
|
<version>${spring.version}</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -34,7 +36,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>software.amazon.awssdk</groupId>
|
<groupId>software.amazon.awssdk</groupId>
|
||||||
<artifactId>bom</artifactId>
|
<artifactId>bom</artifactId>
|
||||||
<version>2.10.27</version>
|
<version>${awssdk.version}</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -106,7 +106,7 @@
|
|||||||
<arguments>
|
<arguments>
|
||||||
<argument>java</argument>
|
<argument>java</argument>
|
||||||
<argument>-jar</argument>
|
<argument>-jar</argument>
|
||||||
<argument>sample-blade-app.jar</argument>
|
<argument>blade.jar</argument>
|
||||||
</arguments>
|
</arguments>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
@ -124,7 +124,7 @@
|
|||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
<version>3.1.0</version>
|
<version>${assembly.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<finalName>${project.build.finalName}</finalName>
|
<finalName>${project.build.finalName}</finalName>
|
||||||
<appendAssemblyId>false</appendAssemblyId>
|
<appendAssemblyId>false</appendAssemblyId>
|
||||||
@ -161,6 +161,7 @@
|
|||||||
<assertj-core.version>3.11.1</assertj-core.version>
|
<assertj-core.version>3.11.1</assertj-core.version>
|
||||||
<maven-failsafe-plugin.version>3.0.0-M3</maven-failsafe-plugin.version>
|
<maven-failsafe-plugin.version>3.0.0-M3</maven-failsafe-plugin.version>
|
||||||
<process-exec-maven-plugin.version>0.7</process-exec-maven-plugin.version>
|
<process-exec-maven-plugin.version>0.7</process-exec-maven-plugin.version>
|
||||||
|
<assembly.plugin.version>3.1.0</assembly.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
21
cloud-foundry-uaa/pom.xml
Normal file
21
cloud-foundry-uaa/pom.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>cloud-foundry-uaa</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>cloud-foundry-uaa</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>cf-uaa-oauth2-client</module>
|
||||||
|
<module>cf-uaa-oauth2-resource-server</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
@ -62,12 +62,12 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
<artifactId>groovy-eclipse-compiler</artifactId>
|
<artifactId>groovy-eclipse-compiler</artifactId>
|
||||||
<version>3.3.0-01</version>
|
<version>${groovy.compiler.version}</version>
|
||||||
<extensions>true</extensions>
|
<extensions>true</extensions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.8.0</version>
|
<version>${compiler.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<compilerId>groovy-eclipse-compiler</compilerId>
|
<compilerId>groovy-eclipse-compiler</compilerId>
|
||||||
<source>${java.version}</source>
|
<source>${java.version}</source>
|
||||||
@ -77,7 +77,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
<artifactId>groovy-eclipse-compiler</artifactId>
|
<artifactId>groovy-eclipse-compiler</artifactId>
|
||||||
<version>3.3.0-01</version>
|
<version>${groovy.compiler.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
@ -113,7 +113,7 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.20.1</version>
|
<version>${surefire.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<useFile>false</useFile>
|
<useFile>false</useFile>
|
||||||
<includes>
|
<includes>
|
||||||
@ -126,7 +126,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
<version>3.1.0</version>
|
<version>${assembly.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- get all project dependencies -->
|
<!-- get all project dependencies -->
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
@ -183,6 +183,10 @@
|
|||||||
<groovy-wslite.version>1.1.3</groovy-wslite.version>
|
<groovy-wslite.version>1.1.3</groovy-wslite.version>
|
||||||
<logback.version>1.2.3</logback.version>
|
<logback.version>1.2.3</logback.version>
|
||||||
<groovy.version>2.5.7</groovy.version>
|
<groovy.version>2.5.7</groovy.version>
|
||||||
|
<assembly.plugin.version>3.1.0</assembly.plugin.version>
|
||||||
|
<surefire.plugin.version>2.20.1</surefire.plugin.version>
|
||||||
|
<compiler.plugin.version>3.8.0</compiler.plugin.version>
|
||||||
|
<groovy.compiler.version>3.3.0-01</groovy.compiler.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -2,10 +2,13 @@ package com.baeldung.metaprogramming.extension
|
|||||||
|
|
||||||
import com.baeldung.metaprogramming.Employee
|
import com.baeldung.metaprogramming.Employee
|
||||||
|
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.Year
|
||||||
|
|
||||||
class BasicExtensions {
|
class BasicExtensions {
|
||||||
|
|
||||||
static int getYearOfBirth(Employee self) {
|
static int getYearOfBirth(Employee self) {
|
||||||
return (new Date().getYear() + 1900) - self.age;
|
return Year.now().value - self.age
|
||||||
}
|
}
|
||||||
|
|
||||||
static String capitalize(String self) {
|
static String capitalize(String self) {
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package com.baeldung.metaprogramming
|
package com.baeldung.metaprogramming
|
||||||
|
|
||||||
import groovy.time.TimeCategory
|
|
||||||
|
import java.time.LocalDate
|
||||||
|
import java.time.Period
|
||||||
|
import java.time.Year
|
||||||
|
|
||||||
class MetaprogrammingUnitTest extends GroovyTestCase {
|
class MetaprogrammingUnitTest extends GroovyTestCase {
|
||||||
|
|
||||||
@ -51,14 +54,16 @@ class MetaprogrammingUnitTest extends GroovyTestCase {
|
|||||||
|
|
||||||
void testJavaMetaClass() {
|
void testJavaMetaClass() {
|
||||||
String.metaClass.capitalize = { String str ->
|
String.metaClass.capitalize = { String str ->
|
||||||
str.substring(0, 1).toUpperCase() + str.substring(1);
|
str.substring(0, 1).toUpperCase() + str.substring(1)
|
||||||
}
|
}
|
||||||
assert "norman".capitalize() == "Norman"
|
assert "norman".capitalize() == "Norman"
|
||||||
}
|
}
|
||||||
|
|
||||||
void testEmployeeExtension() {
|
void testEmployeeExtension() {
|
||||||
Employee emp = new Employee(age: 28)
|
def age = 28
|
||||||
assert emp.getYearOfBirth() == 1991
|
def expectedYearOfBirth = Year.now() - age
|
||||||
|
Employee emp = new Employee(age: age)
|
||||||
|
assert emp.getYearOfBirth() == expectedYearOfBirth.value
|
||||||
}
|
}
|
||||||
|
|
||||||
void testJavaClassesExtensions() {
|
void testJavaClassesExtensions() {
|
||||||
@ -115,4 +120,4 @@ class MetaprogrammingUnitTest extends GroovyTestCase {
|
|||||||
Employee employee = new Employee(1, "Norman", "Lewis", 28)
|
Employee employee = new Employee(1, "Norman", "Lewis", 28)
|
||||||
employee.logEmp()
|
employee.logEmp()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import wslite.soap.SOAPMessageBuilder
|
|||||||
import wslite.http.auth.HTTPBasicAuthorization
|
import wslite.http.auth.HTTPBasicAuthorization
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class WebserviceUnitTest extends GroovyTestCase {
|
class WebserviceManualTest extends GroovyTestCase {
|
||||||
|
|
||||||
JsonSlurper jsonSlurper = new JsonSlurper()
|
JsonSlurper jsonSlurper = new JsonSlurper()
|
||||||
|
|
||||||
@ -149,4 +149,4 @@ class WebserviceUnitTest extends GroovyTestCase {
|
|||||||
assert e?.response?.statusCode != 200
|
assert e?.response?.statusCode != 200
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.20.1</version>
|
<version>${surefire.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<useFile>false</useFile>
|
<useFile>false</useFile>
|
||||||
<includes>
|
<includes>
|
||||||
@ -126,6 +126,7 @@
|
|||||||
<hsqldb.version>2.4.0</hsqldb.version>
|
<hsqldb.version>2.4.0</hsqldb.version>
|
||||||
<spock-core.version>1.1-groovy-2.4</spock-core.version>
|
<spock-core.version>1.1-groovy-2.4</spock-core.version>
|
||||||
<gmavenplus-plugin.version>1.6</gmavenplus-plugin.version>
|
<gmavenplus-plugin.version>1.6</gmavenplus-plugin.version>
|
||||||
|
<surefire.plugin.version>2.20.1</surefire.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.baeldung.file
|
package com.baeldung.file
|
||||||
|
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Ignore
|
||||||
|
|
||||||
class ReadFileUnitTest extends Specification {
|
class ReadFileUnitTest extends Specification {
|
||||||
|
|
||||||
|
@ -13,3 +13,4 @@ This module contains articles about Java 11 core features
|
|||||||
- [Guide to jlink](https://www.baeldung.com/jlink)
|
- [Guide to jlink](https://www.baeldung.com/jlink)
|
||||||
- [Negate a Predicate Method Reference with Java 11](https://www.baeldung.com/java-negate-predicate-method-reference)
|
- [Negate a Predicate Method Reference with Java 11](https://www.baeldung.com/java-negate-predicate-method-reference)
|
||||||
- [Benchmark JDK Collections vs Eclipse Collections](https://www.baeldung.com/jdk-collections-vs-eclipse-collections)
|
- [Benchmark JDK Collections vs Eclipse Collections](https://www.baeldung.com/jdk-collections-vs-eclipse-collections)
|
||||||
|
- [Pre-compile Regex Patterns Into Pattern Objects](https://www.baeldung.com/java-regex-pre-compile)
|
||||||
|
@ -42,12 +42,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.collections</groupId>
|
<groupId>org.eclipse.collections</groupId>
|
||||||
<artifactId>eclipse-collections</artifactId>
|
<artifactId>eclipse-collections</artifactId>
|
||||||
<version>10.0.0</version>
|
<version>${eclipse.collections.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.collections</groupId>
|
<groupId>org.eclipse.collections</groupId>
|
||||||
<artifactId>eclipse-collections-api</artifactId>
|
<artifactId>eclipse-collections-api</artifactId>
|
||||||
<version>10.0.0</version>
|
<version>${eclipse.collections.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
@ -65,7 +65,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
<version>3.2.1</version>
|
<version>${shade.plugin.version}</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
@ -108,6 +108,8 @@
|
|||||||
<assertj.version>3.11.1</assertj.version>
|
<assertj.version>3.11.1</assertj.version>
|
||||||
<uberjar.name>benchmarks</uberjar.name>
|
<uberjar.name>benchmarks</uberjar.name>
|
||||||
<jmh.version>1.22</jmh.version>
|
<jmh.version>1.22</jmh.version>
|
||||||
|
<eclipse.collections.version>10.0.0</eclipse.collections.version>
|
||||||
|
<shade.plugin.version>10.0.0</shade.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
4
core-java-modules/core-java-13/README.md
Normal file
4
core-java-modules/core-java-13/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
### Relevant articles:
|
||||||
|
|
||||||
|
- [Java Switch Statement](https://www.baeldung.com/java-switch)
|
||||||
|
- [New Java 13 Features](https://www.baeldung.com/java-13-new-features)
|
@ -41,7 +41,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>3.0.0-M3</version>
|
<version>${surefire.plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<argLine>--enable-preview</argLine>
|
<argLine>--enable-preview</argLine>
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -53,6 +53,7 @@
|
|||||||
<maven.compiler.source.version>13</maven.compiler.source.version>
|
<maven.compiler.source.version>13</maven.compiler.source.version>
|
||||||
<maven.compiler.target.version>13</maven.compiler.target.version>
|
<maven.compiler.target.version>13</maven.compiler.target.version>
|
||||||
<assertj.version>3.6.1</assertj.version>
|
<assertj.version>3.6.1</assertj.version>
|
||||||
|
<surefire.plugin.version>3.0.0-M3</surefire.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.baeldung.newfeatures;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class SwitchExpressionsWithYieldUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("preview")
|
||||||
|
public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() {
|
||||||
|
var me = 4;
|
||||||
|
var operation = "squareMe";
|
||||||
|
var result = switch (operation) {
|
||||||
|
case "doubleMe" -> {
|
||||||
|
yield me * 2;
|
||||||
|
}
|
||||||
|
case "squareMe" -> {
|
||||||
|
yield me * me;
|
||||||
|
}
|
||||||
|
default -> me;
|
||||||
|
};
|
||||||
|
|
||||||
|
assertEquals(16, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.newfeatures;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TextBlocksUnitTest {
|
||||||
|
|
||||||
|
private static final String JSON_STRING = "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : \"https://www.%s.com/\"\r\n" + "}";
|
||||||
|
|
||||||
|
@SuppressWarnings("preview")
|
||||||
|
private static final String TEXT_BLOCK_JSON = """
|
||||||
|
{
|
||||||
|
"name" : "Baeldung",
|
||||||
|
"website" : "https://www.%s.com/"
|
||||||
|
}
|
||||||
|
""";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenTextBlocks_thenStringOperationsWork() {
|
||||||
|
|
||||||
|
assertThat(TEXT_BLOCK_JSON.contains("Baeldung")).isTrue();
|
||||||
|
assertThat(TEXT_BLOCK_JSON.indexOf("www")).isGreaterThan(0);
|
||||||
|
assertThat(TEXT_BLOCK_JSON.length()).isGreaterThan(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal")
|
||||||
|
@Test
|
||||||
|
public void whenTextBlocks_thenFormattedWorksAsFormat() {
|
||||||
|
assertThat(TEXT_BLOCK_JSON.formatted("baeldung")
|
||||||
|
.contains("www.baeldung.com")).isTrue();
|
||||||
|
|
||||||
|
assertThat(String.format(JSON_STRING, "baeldung")
|
||||||
|
.contains("www.baeldung.com")).isTrue();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
1
core-java-modules/core-java-14/.mvn/jvm.config
Normal file
1
core-java-modules/core-java-14/.mvn/jvm.config
Normal file
@ -0,0 +1 @@
|
|||||||
|
--enable-preview
|
7
core-java-modules/core-java-14/README.md
Normal file
7
core-java-modules/core-java-14/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
## Core Java 14
|
||||||
|
|
||||||
|
This module contains articles about Java 14.
|
||||||
|
|
||||||
|
### Relevant articles
|
||||||
|
|
||||||
|
- [Guide to the @Serial Annotation in Java 14](https://www.baeldung.com/java-14-serial-annotation)
|
66
core-java-modules/core-java-14/pom.xml
Normal file
66
core-java-modules/core-java-14/pom.xml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-java-14</artifactId>
|
||||||
|
<name>core-java-14</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<url>http://maven.apache.org</url>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../</relativePath>
|
||||||
|
</parent>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${assertj.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>${junit-jupiter.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>${junit-jupiter.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<release>${maven.compiler.release}</release>
|
||||||
|
<compilerArgs>--enable-preview</compilerArgs>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${surefire.plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<argLine>--enable-preview</argLine>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.release>14</maven.compiler.release>
|
||||||
|
<assertj.version>3.6.1</assertj.version>
|
||||||
|
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
|
||||||
|
<surefire.plugin.version>3.0.0-M3</surefire.plugin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,46 @@
|
|||||||
|
package com.baeldung.java14.textblocks;
|
||||||
|
|
||||||
|
public class TextBlocks13 {
|
||||||
|
public String getBlockOfHtml() {
|
||||||
|
return """
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<span>example text</span>
|
||||||
|
</body>
|
||||||
|
</html>""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNonStandardIndent() {
|
||||||
|
return """
|
||||||
|
Indent
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQuery() {
|
||||||
|
return """
|
||||||
|
select "id", "user"
|
||||||
|
from "table"
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTextWithCarriageReturns() {
|
||||||
|
return """
|
||||||
|
separated with\r
|
||||||
|
carriage returns""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTextWithEscapes() {
|
||||||
|
return """
|
||||||
|
fun with\n
|
||||||
|
whitespace\t\r
|
||||||
|
and other escapes \"""
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormattedText(String parameter) {
|
||||||
|
return """
|
||||||
|
Some parameter: %s
|
||||||
|
""".formatted(parameter);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.baeldung.java14.textblocks;
|
||||||
|
|
||||||
|
public class TextBlocks14 {
|
||||||
|
public String getIgnoredNewLines() {
|
||||||
|
return """
|
||||||
|
This is a long test which looks to \
|
||||||
|
have a newline but actually does not""";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEscapedSpaces() {
|
||||||
|
return """
|
||||||
|
line 1
|
||||||
|
line 2 \s
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.baeldung.serial;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.io.ObjectStreamException;
|
||||||
|
import java.io.ObjectStreamField;
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class showcasing the usage of the Java 14 @Serial annotation.
|
||||||
|
*
|
||||||
|
* @author Donato Rimenti
|
||||||
|
*/
|
||||||
|
public class MySerialClass implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final ObjectStreamField[] serialPersistentFields = null;
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1;
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private void writeObject(ObjectOutputStream stream) throws IOException {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private void readObjectNoData() throws ObjectStreamException {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private Object writeReplace() throws ObjectStreamException {
|
||||||
|
// ...
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private Object readResolve() throws ObjectStreamException {
|
||||||
|
// ...
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.baeldung.java14.textblocks;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class TextBlocks13UnitTest {
|
||||||
|
private TextBlocks13 subject = new TextBlocks13();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() {
|
||||||
|
String expected = "<html>\n"
|
||||||
|
+ "\n"
|
||||||
|
+ " <body>\n"
|
||||||
|
+ " <span>example text</span>\n"
|
||||||
|
+ " </body>\n"
|
||||||
|
+ "</html>";
|
||||||
|
assertThat(subject.getBlockOfHtml()).isEqualTo(expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() {
|
||||||
|
String expected = "<html>\n\n <body>\n <span>example text</span>\n </body>\n</html>";
|
||||||
|
assertThat(subject.getBlockOfHtml()).isEqualTo(expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAnIndentedString_thenMatchesIndentedOldStyle() {
|
||||||
|
assertThat(subject.getNonStandardIndent()).isEqualTo(" Indent\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAMultilineQuery_thenItCanContainUnescapedQuotes() {
|
||||||
|
assertThat(subject.getQuery()).contains("select \"id\", \"user\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAMultilineQuery_thenItEndWithANewline() {
|
||||||
|
assertThat(subject.getQuery()).endsWith("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenATextWithCarriageReturns_thenItContainsBoth() {
|
||||||
|
assertThat(subject.getTextWithCarriageReturns()).isEqualTo("separated with\r\ncarriage returns");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAStringWithEscapedWhitespace_thenItAppearsInTheResultingString() {
|
||||||
|
assertThat(subject.getTextWithEscapes()).contains("fun with\n\n")
|
||||||
|
.contains("whitespace\t\r\n")
|
||||||
|
.contains("and other escapes \"\"\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAFormattedString_thenTheParameterIsReplaced() {
|
||||||
|
assertThat(subject.getFormattedText("parameter")).contains("Some parameter: parameter");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.java14.textblocks;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class TextBlocks14UnitTest {
|
||||||
|
private TextBlocks14 subject = new TextBlocks14();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() {
|
||||||
|
String expected = "This is a long test which looks to have a newline but actually does not";
|
||||||
|
assertThat(subject.getIgnoredNewLines()).isEqualTo(expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() {
|
||||||
|
String expected = "line 1\nline 2 \n";
|
||||||
|
assertThat(subject.getEscapedSpaces()).isEqualTo(expected);
|
||||||
|
}
|
||||||
|
}
|
@ -61,7 +61,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<classifier>spring-boot</classifier>
|
<classifier>spring-boot</classifier>
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
|
@ -9,6 +9,7 @@ This module contains articles about Java 9 core features
|
|||||||
- [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range)
|
- [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range)
|
||||||
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
|
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
|
||||||
- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set)
|
- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set)
|
||||||
|
- [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list)
|
||||||
|
|
||||||
Note: also contains part of the code for the article
|
Note: also contains part of the code for the article
|
||||||
[How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering).
|
[How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering).
|
||||||
|
@ -37,6 +37,11 @@
|
|||||||
<version>${junit.platform.version}</version>
|
<version>${junit.platform.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-collections4</artifactId>
|
||||||
|
<version>${commons-collections4.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -69,6 +74,7 @@
|
|||||||
<maven.compiler.source>1.9</maven.compiler.source>
|
<maven.compiler.source>1.9</maven.compiler.source>
|
||||||
<maven.compiler.target>1.9</maven.compiler.target>
|
<maven.compiler.target>1.9</maven.compiler.target>
|
||||||
<guava.version>25.1-jre</guava.version>
|
<guava.version>25.1-jre</guava.version>
|
||||||
|
<commons-collections4.version>4.1</commons-collections4.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,56 +1,48 @@
|
|||||||
package org.baeldung.java.collections;
|
package com.baeldung.java9.list.immutable;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import org.apache.commons.collections4.ListUtils;
|
import org.apache.commons.collections4.ListUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CoreJavaCollectionsUnitTest {
|
public class ImmutableArrayListUnitTest {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(CoreJavaCollectionsUnitTest.class);
|
|
||||||
|
|
||||||
|
|
||||||
// tests -
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public final void givenUsingTheJdk_whenArrayListIsSynchronized_thenCorrect() {
|
|
||||||
final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
|
|
||||||
final List<String> synchronizedList = Collections.synchronizedList(list);
|
|
||||||
LOG.debug("Synchronized List is: " + synchronizedList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = UnsupportedOperationException.class)
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
public final void givenUsingTheJdk_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
|
public final void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
|
||||||
final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
final List<String> unmodifiableList = Collections.unmodifiableList(list);
|
final List<String> unmodifiableList = Collections.unmodifiableList(list);
|
||||||
unmodifiableList.add("four");
|
unmodifiableList.add("four");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = UnsupportedOperationException.class)
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
public final void givenUsingGuava_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
|
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
|
||||||
final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
|
final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
|
||||||
|
unmodifiableList.add("four");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
|
public final void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
|
||||||
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
final List<String> unmodifiableList = ImmutableList.copyOf(list);
|
final List<String> unmodifiableList = ImmutableList.copyOf(list);
|
||||||
unmodifiableList.add("four");
|
unmodifiableList.add("four");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = UnsupportedOperationException.class)
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
|
public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
|
||||||
final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
final ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
|
final ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
|
||||||
unmodifiableList.add("four");
|
unmodifiableList.add("four");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = UnsupportedOperationException.class)
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
|
public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
|
||||||
final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
final List<String> unmodifiableList = ListUtils.unmodifiableList(list);
|
final List<String> unmodifiableList = ListUtils.unmodifiableList(list);
|
||||||
unmodifiableList.add("four");
|
unmodifiableList.add("four");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -13,4 +13,5 @@ This module contains articles about Java arrays
|
|||||||
- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
|
- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
|
||||||
- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
|
- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
|
||||||
- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list)
|
- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list)
|
||||||
|
- [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort)
|
||||||
- [[<-- Prev]](/core-java-modules/core-java-arrays)
|
- [[<-- Prev]](/core-java-modules/core-java-arrays)
|
||||||
|
@ -19,6 +19,16 @@
|
|||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>${commons-lang3.version}</version>
|
<version>${commons-lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-core</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
|
<version>${jmh.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- test scoped -->
|
<!-- test scoped -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -37,13 +47,39 @@
|
|||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>${shade.plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<finalName>benchmarks</finalName>
|
||||||
|
<transformers>
|
||||||
|
<transformer
|
||||||
|
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
|
<mainClass>org.openjdk.jmh.Main</mainClass>
|
||||||
|
</transformer>
|
||||||
|
</transformers>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
<jmh.version>1.19</jmh.version>
|
||||||
<!-- util -->
|
<!-- util -->
|
||||||
<commons-lang3.version>3.9</commons-lang3.version>
|
<commons-lang3.version>3.9</commons-lang3.version>
|
||||||
<!-- testing -->
|
<!-- testing -->
|
||||||
<assertj-core.version>3.10.0</assertj-core.version>
|
<assertj-core.version>3.10.0</assertj-core.version>
|
||||||
|
<shade.plugin.version>3.2.0</shade.plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.baeldung.arraysort;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
import org.openjdk.jmh.annotations.Fork;
|
||||||
|
import org.openjdk.jmh.annotations.Level;
|
||||||
|
import org.openjdk.jmh.annotations.Measurement;
|
||||||
|
import org.openjdk.jmh.annotations.Mode;
|
||||||
|
import org.openjdk.jmh.annotations.OutputTimeUnit;
|
||||||
|
import org.openjdk.jmh.annotations.Param;
|
||||||
|
import org.openjdk.jmh.annotations.Scope;
|
||||||
|
import org.openjdk.jmh.annotations.Setup;
|
||||||
|
import org.openjdk.jmh.annotations.State;
|
||||||
|
import org.openjdk.jmh.annotations.Warmup;
|
||||||
|
import org.openjdk.jmh.infra.Blackhole;
|
||||||
|
|
||||||
|
@BenchmarkMode(Mode.AverageTime)
|
||||||
|
@Warmup(iterations = 5)
|
||||||
|
@Measurement(iterations = 10)
|
||||||
|
@Fork(2)
|
||||||
|
@OutputTimeUnit(TimeUnit.MILLISECONDS)
|
||||||
|
public class ArraySortingBenchmark {
|
||||||
|
|
||||||
|
@State(Scope.Benchmark)
|
||||||
|
public static class ArrayContainer {
|
||||||
|
|
||||||
|
@Param({ "1000", "10000", "100000", "1000000" })
|
||||||
|
int arraySize;
|
||||||
|
|
||||||
|
// initial unsorted array
|
||||||
|
int[] unsortedArray;
|
||||||
|
|
||||||
|
//cloned array to sort
|
||||||
|
int[] arrayToSort;
|
||||||
|
|
||||||
|
@Setup(Level.Trial)
|
||||||
|
public void createUnSortedArray() {
|
||||||
|
unsortedArray = new int[arraySize];
|
||||||
|
for (int i = 0; i < arraySize; i++) {
|
||||||
|
unsortedArray[i] = new Random().nextInt(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Setup(Level.Invocation)
|
||||||
|
public void createUnSortedArrayCopy() {
|
||||||
|
arrayToSort = unsortedArray.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
int[] getArrayToSort() {
|
||||||
|
return arrayToSort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public void benchmark_arrays_parallel_sort(ArrayContainer d, Blackhole b) {
|
||||||
|
int[] arr = d.getArrayToSort();
|
||||||
|
Arrays.parallelSort(arr);
|
||||||
|
b.consume(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public void benchmark_arrays_sort(ArrayContainer d, Blackhole b) {
|
||||||
|
int[] arr = d.getArrayToSort();
|
||||||
|
Arrays.sort(arr);
|
||||||
|
b.consume(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -69,7 +69,7 @@ public class SortComparisonUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenArrayOfIntegers_whenUsingArraysSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() {
|
public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() {
|
||||||
int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
|
int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
|
||||||
int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
|
int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ public class SortComparisonUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenArrayOfIntegers_whenUsingArraysParallelSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() {
|
public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() {
|
||||||
int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
|
int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
|
||||||
int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
|
int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
|
||||||
|
|
||||||
|
5
core-java-modules/core-java-arrays-3/README.md
Normal file
5
core-java-modules/core-java-arrays-3/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## Core Java Arrays (Part 3)
|
||||||
|
|
||||||
|
This module contains articles about Java arrays
|
||||||
|
|
||||||
|
## Relevant Articles
|
31
core-java-modules/core-java-arrays-3/pom.xml
Normal file
31
core-java-modules/core-java-arrays-3/pom.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-java-arrays-3</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
<name>core-java-arrays-3</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-java</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-java</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${assertj.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<assertj.version>3.14.0</assertj.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,96 @@
|
|||||||
|
package com.baeldung.arrays.deepequals;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class ArraysDeepEqualsUnitTest {
|
||||||
|
|
||||||
|
class Person {
|
||||||
|
private int id;
|
||||||
|
private String name;
|
||||||
|
private int age;
|
||||||
|
|
||||||
|
Person(int id, String name, int age) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof Person))
|
||||||
|
return false;
|
||||||
|
Person person = (Person) obj;
|
||||||
|
return id == person.id && name.equals(person.name) && age == person.age;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(id, name, age);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoUnidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() {
|
||||||
|
Object[] anArray = new Object[] { "string1", "string2", "string3" };
|
||||||
|
Object[] anotherArray = new Object[] { "string1", "string2", "string3" };
|
||||||
|
|
||||||
|
assertTrue(Arrays.equals(anArray, anotherArray));
|
||||||
|
assertTrue(Arrays.deepEquals(anArray, anotherArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoUnidimensionalObjectTypeArraysWithNullElements_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() {
|
||||||
|
Object[] anArray = new Object[] { "string1", null, "string3" };
|
||||||
|
Object[] anotherArray = new Object[] { "string1", null, "string3" };
|
||||||
|
|
||||||
|
assertTrue(Arrays.equals(anArray, anotherArray));
|
||||||
|
assertTrue(Arrays.deepEquals(anArray, anotherArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoUnidimensionalObjectTypeArraysWithNestedElements_whenUsingEqualsAndDeepEquals_thenShouldReturnDifferently() {
|
||||||
|
Object[] anArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } };
|
||||||
|
Object[] anotherArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } };
|
||||||
|
|
||||||
|
assertFalse(Arrays.equals(anArray, anotherArray));
|
||||||
|
assertTrue(Arrays.deepEquals(anArray, anotherArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoMultidimensionalPrimitiveTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() {
|
||||||
|
int[][] anArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };
|
||||||
|
int[][] anotherArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };
|
||||||
|
|
||||||
|
assertFalse(Arrays.equals(anArray, anotherArray));
|
||||||
|
assertTrue(Arrays.deepEquals(anArray, anotherArray));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoMultidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() {
|
||||||
|
Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
|
||||||
|
Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
|
||||||
|
|
||||||
|
assertFalse(Arrays.equals(personArray1, personArray2));
|
||||||
|
assertTrue(Arrays.deepEquals(personArray1, personArray2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenTwoMultidimensionalObjectTypeArrays_whenUsingDeepEqualsFromObjectsAndArraysClasses_thenBothShouldReturnTrue() {
|
||||||
|
Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
|
||||||
|
Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
|
||||||
|
|
||||||
|
assertTrue(Objects.deepEquals(personArray1, personArray2));
|
||||||
|
assertTrue(Arrays.deepEquals(personArray1, personArray2));
|
||||||
|
}
|
||||||
|
}
|
@ -75,7 +75,7 @@
|
|||||||
<manifest>
|
<manifest>
|
||||||
<addClasspath>true</addClasspath>
|
<addClasspath>true</addClasspath>
|
||||||
<classpathPrefix>libs/</classpathPrefix>
|
<classpathPrefix>libs/</classpathPrefix>
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -94,7 +94,7 @@
|
|||||||
<archiveBaseDirectory>${project.basedir}</archiveBaseDirectory>
|
<archiveBaseDirectory>${project.basedir}</archiveBaseDirectory>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
@ -118,7 +118,7 @@
|
|||||||
<shadedArtifactAttached>true</shadedArtifactAttached>
|
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||||
<transformers>
|
<transformers>
|
||||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
</transformer>
|
</transformer>
|
||||||
</transformers>
|
</transformers>
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -133,7 +133,7 @@
|
|||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<configuration>
|
<configuration>
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
<attachToBuild>true</attachToBuild>
|
<attachToBuild>true</attachToBuild>
|
||||||
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
|
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -155,7 +155,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<classifier>spring-boot</classifier>
|
<classifier>spring-boot</classifier>
|
||||||
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
|
<mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
@ -183,8 +183,8 @@
|
|||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
<version>${maven-javadoc-plugin.version}</version>
|
<version>${maven-javadoc-plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.8</source>
|
<source>${source.version}</source>
|
||||||
<target>1.8</target>
|
<target>${target.version}</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
@ -373,6 +373,8 @@
|
|||||||
<maven-shade-plugin.version>3.1.1</maven-shade-plugin.version>
|
<maven-shade-plugin.version>3.1.1</maven-shade-plugin.version>
|
||||||
<spring-boot-maven-plugin.version>2.0.3.RELEASE</spring-boot-maven-plugin.version>
|
<spring-boot-maven-plugin.version>2.0.3.RELEASE</spring-boot-maven-plugin.version>
|
||||||
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
|
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
|
||||||
|
<source.version>1.8</source.version>
|
||||||
|
<target.version>1.8</target.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
package com.baeldung.array;
|
|
||||||
|
|
||||||
public class Find2ndLargestInArray {
|
|
||||||
|
|
||||||
public static int find2ndLargestElement(int[] array) {
|
|
||||||
int maxElement = array[0];
|
|
||||||
int secondLargestElement = -1;
|
|
||||||
|
|
||||||
for (int index = 0; index < array.length; index++) {
|
|
||||||
if (maxElement <= array[index]) {
|
|
||||||
secondLargestElement = maxElement;
|
|
||||||
maxElement = array[index];
|
|
||||||
} else if (secondLargestElement < array[index]) {
|
|
||||||
secondLargestElement = array[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return secondLargestElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package com.baeldung.array;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class FindElementInArray {
|
|
||||||
|
|
||||||
public static boolean findGivenElementInArrayWithoutUsingStream(int[] array, int element) {
|
|
||||||
boolean actualResult = false;
|
|
||||||
|
|
||||||
for (int index = 0; index < array.length; index++) {
|
|
||||||
if (element == array[index]) {
|
|
||||||
actualResult = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return actualResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean findGivenElementInArrayUsingStream(int[] array, int element) {
|
|
||||||
return Arrays.stream(array).filter(x -> element == x).findFirst().isPresent();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package com.baeldung.array;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class Find2ndLargestInArrayUnitTest {
|
|
||||||
@Test
|
|
||||||
public void givenAnIntArray_thenFind2ndLargestElement() {
|
|
||||||
int[] array = { 1, 3, 24, 16, 87, 20 };
|
|
||||||
int expected2ndLargest = 24;
|
|
||||||
|
|
||||||
int actualSecondLargestElement = Find2ndLargestInArray.find2ndLargestElement(array);
|
|
||||||
|
|
||||||
Assert.assertEquals(expected2ndLargest, actualSecondLargestElement);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
package com.baeldung.array;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class FindElementInArrayUnitTest {
|
|
||||||
@Test
|
|
||||||
public void givenAnIntArray_whenNotUsingStream_thenFindAnElement() {
|
|
||||||
int[] array = { 1, 3, 4, 8, 19, 20 };
|
|
||||||
int element = 19;
|
|
||||||
boolean expectedResult = true;
|
|
||||||
boolean actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element);
|
|
||||||
Assert.assertEquals(expectedResult, actualResult);
|
|
||||||
|
|
||||||
element = 78;
|
|
||||||
expectedResult = false;
|
|
||||||
actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element);
|
|
||||||
Assert.assertEquals(expectedResult, actualResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenAnIntArray_whenUsingStream_thenFindAnElement() {
|
|
||||||
int[] array = { 15, 16, 12, 18 };
|
|
||||||
int element = 16;
|
|
||||||
boolean expectedResult = true;
|
|
||||||
boolean actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element);
|
|
||||||
Assert.assertEquals(expectedResult, actualResult);
|
|
||||||
|
|
||||||
element = 20;
|
|
||||||
expectedResult = false;
|
|
||||||
actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element);
|
|
||||||
Assert.assertEquals(expectedResult, actualResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -3,9 +3,8 @@
|
|||||||
This module contains articles about the Java ArrayList collection
|
This module contains articles about the Java ArrayList collection
|
||||||
|
|
||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
|
- [Guide to the Java ArrayList](https://www.baeldung.com/java-arraylist)
|
||||||
- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
|
- [Add Multiple Items to an Java ArrayList](https://www.baeldung.com/java-add-items-array-list)
|
||||||
- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
|
|
||||||
- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
|
- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
|
||||||
- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
|
- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
|
||||||
- [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element)
|
- [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package org.baeldung.java.collections;
|
package com.baeldung.collections;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.collections;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.apache.commons.collections4.ListUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CoreJavaCollectionsUnitTest {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CoreJavaCollectionsUnitTest.class);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public final void givenUsingTheJdk_whenArrayListIsSynchronized_thenCorrect() {
|
||||||
|
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
|
||||||
|
final List<String> synchronizedList = Collections.synchronizedList(list);
|
||||||
|
LOG.debug("Synchronized List is: " + synchronizedList);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,13 +3,13 @@
|
|||||||
This module contains articles about the Java List collection
|
This module contains articles about the Java List collection
|
||||||
|
|
||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
|
- [Check If Two Lists are Equal in Java](https://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
|
||||||
- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
|
- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
|
||||||
- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
|
- [A Guide to the Java LinkedList](https://www.baeldung.com/java-linkedlist)
|
||||||
- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
|
- [Java List UnsupportedOperationException](https://www.baeldung.com/java-list-unsupported-operation-exception)
|
||||||
- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
|
- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
|
||||||
- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
|
- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
|
||||||
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
|
- [Flattening Nested Collections in Java](https://www.baeldung.com/java-flatten-nested-collections)
|
||||||
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
|
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
|
||||||
- [Searching for a String in an ArrayList](https://www.baeldung.com/java-search-string-arraylist)
|
- [Searching for a String in an ArrayList](https://www.baeldung.com/java-search-string-arraylist)
|
||||||
- [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3)
|
- [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package org.baeldung.java.lists;
|
package com.baeldung.java.list;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package org.baeldung.java.lists;
|
package com.baeldung.java.list;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
@ -1,4 +1,4 @@
|
|||||||
package org.baeldung.java.lists;
|
package com.baeldung.java.list;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
### Relevant Articles:
|
|
||||||
- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
|
|
@ -24,11 +24,21 @@ public class DuplicatesCounter {
|
|||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> Map<T, Long> countByClassicalLoopWithMapCompute(List<T> inputList) {
|
public static <T> Map<T, Long> countByForEachLoopWithGetOrDefault(List<T> inputList) {
|
||||||
Map<T, Long> resultMap = new HashMap<>();
|
Map<T, Long> resultMap = new HashMap<>();
|
||||||
for (T element : inputList) {
|
inputList.forEach(e -> resultMap.put(e, resultMap.getOrDefault(e, 0L) + 1L));
|
||||||
resultMap.compute(element, (k, v) -> v == null ? 1 : v + 1);
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> Map<T, Long> countByForEachLoopWithMapCompute(List<T> inputList) {
|
||||||
|
Map<T, Long> resultMap = new HashMap<>();
|
||||||
|
inputList.forEach(e -> resultMap.compute(e, (k, v) -> v == null ? 1L : v + 1L));
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Map<T, Long> countByForEachLoopWithMapMerge(List<T> inputList) {
|
||||||
|
Map<T, Long> resultMap = new HashMap<>();
|
||||||
|
inputList.forEach(e -> resultMap.merge(e, 1L, Long::sum));
|
||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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