Merge branch 'master' of https://github.com/eugenp/tutorials into ABA_problem

This commit is contained in:
Gergo Petrik
2020-05-17 08:21:35 +02:00
769 changed files with 10047 additions and 2765 deletions
+2 -6
View File
@@ -15,9 +15,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
- [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray) - [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray)
- [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays) - [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) - [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) - More articles: [[<-- prev]](/../algorithms-miscellaneous-4) [[next -->]](/../algorithms-miscellaneous-6)
- [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)
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
-6
View File
@@ -25,12 +25,6 @@
<artifactId>commons-math3</artifactId> <artifactId>commons-math3</artifactId>
<version>${commons-math3.version}</version> <version>${commons-math3.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>pl.allegro.finance</groupId> <groupId>pl.allegro.finance</groupId>
<artifactId>tradukisto</artifactId> <artifactId>tradukisto</artifactId>
+6
View File
@@ -2,3 +2,9 @@
- [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm) - [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm)
- [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent) - [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent)
- [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)
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
- More articles: [[<-- prev]](/../algorithms-miscellaneous-5)
+25
View File
@@ -18,10 +18,35 @@
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>${guava.version}</version> <version>${guava.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-commons</artifactId>
<version>${junit.platform.version}</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${org.assertj.core.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>${commons-math3.version}</version>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<guava.version>28.1-jre</guava.version> <guava.version>28.1-jre</guava.version>
<org.assertj.core.version>3.9.0</org.assertj.core.version>
<junit.platform.version>1.6.0</junit.platform.version>
<commons-math3.version>3.6.1</commons-math3.version>
</properties> </properties>
</project> </project>
@@ -1,13 +1,13 @@
package com.baeldung.algorithms.minheapmerge; package com.baeldung.algorithms.minheapmerge;
public class HeapNode { public class HeapNode {
int element; int element;
int arrayIndex; int arrayIndex;
int nextElementIndex = 1; int nextElementIndex = 1;
public HeapNode(int element, int arrayIndex) { public HeapNode(int element, int arrayIndex) {
this.element = element; this.element = element;
this.arrayIndex = arrayIndex; this.arrayIndex = arrayIndex;
} }
} }
@@ -1,88 +1,88 @@
package com.baeldung.algorithms.minheapmerge; package com.baeldung.algorithms.minheapmerge;
public class MinHeap { public class MinHeap {
HeapNode[] heapNodes; HeapNode[] heapNodes;
public MinHeap(HeapNode heapNodes[]) { public MinHeap(HeapNode heapNodes[]) {
this.heapNodes = heapNodes; this.heapNodes = heapNodes;
heapifyFromLastLeafsParent(); heapifyFromLastLeafsParent();
} }
void heapifyFromLastLeafsParent() { void heapifyFromLastLeafsParent() {
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length); int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
while (lastLeafsParentIndex >= 0) { while (lastLeafsParentIndex >= 0) {
heapify(lastLeafsParentIndex); heapify(lastLeafsParentIndex);
lastLeafsParentIndex--; lastLeafsParentIndex--;
} }
} }
void heapify(int index) { void heapify(int index) {
int leftNodeIndex = getLeftNodeIndex(index); int leftNodeIndex = getLeftNodeIndex(index);
int rightNodeIndex = getRightNodeIndex(index); int rightNodeIndex = getRightNodeIndex(index);
int smallestElementIndex = index; int smallestElementIndex = index;
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) { if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
smallestElementIndex = leftNodeIndex; smallestElementIndex = leftNodeIndex;
} }
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) { if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
smallestElementIndex = rightNodeIndex; smallestElementIndex = rightNodeIndex;
} }
if (smallestElementIndex != index) { if (smallestElementIndex != index) {
swap(index, smallestElementIndex); swap(index, smallestElementIndex);
heapify(smallestElementIndex); heapify(smallestElementIndex);
} }
} }
int getParentNodeIndex(int index) { int getParentNodeIndex(int index) {
return (index - 1) / 2; return (index - 1) / 2;
} }
int getLeftNodeIndex(int index) { int getLeftNodeIndex(int index) {
return (2 * index + 1); return (2 * index + 1);
} }
int getRightNodeIndex(int index) { int getRightNodeIndex(int index) {
return (2 * index + 2); return (2 * index + 2);
} }
HeapNode getRootNode() { HeapNode getRootNode() {
return heapNodes[0]; return heapNodes[0];
} }
void heapifyFromRoot() { void heapifyFromRoot() {
heapify(0); heapify(0);
} }
void swap(int i, int j) { void swap(int i, int j) {
HeapNode temp = heapNodes[i]; HeapNode temp = heapNodes[i];
heapNodes[i] = heapNodes[j]; heapNodes[i] = heapNodes[j];
heapNodes[j] = temp; heapNodes[j] = temp;
} }
static int[] merge(int[][] array) { static int[] merge(int[][] array) {
HeapNode[] heapNodes = new HeapNode[array.length]; HeapNode[] heapNodes = new HeapNode[array.length];
int resultingArraySize = 0; int resultingArraySize = 0;
for (int i = 0; i < array.length; i++) { for (int i = 0; i < array.length; i++) {
HeapNode node = new HeapNode(array[i][0], i); HeapNode node = new HeapNode(array[i][0], i);
heapNodes[i] = node; heapNodes[i] = node;
resultingArraySize += array[i].length; resultingArraySize += array[i].length;
} }
MinHeap minHeap = new MinHeap(heapNodes); MinHeap minHeap = new MinHeap(heapNodes);
int[] resultingArray = new int[resultingArraySize]; int[] resultingArray = new int[resultingArraySize];
for (int i = 0; i < resultingArraySize; i++) { for (int i = 0; i < resultingArraySize; i++) {
HeapNode root = minHeap.getRootNode(); HeapNode root = minHeap.getRootNode();
resultingArray[i] = root.element; resultingArray[i] = root.element;
if (root.nextElementIndex < array[root.arrayIndex].length) { if (root.nextElementIndex < array[root.arrayIndex].length) {
root.element = array[root.arrayIndex][root.nextElementIndex++]; root.element = array[root.arrayIndex][root.nextElementIndex++];
} else { } else {
root.element = Integer.MAX_VALUE; root.element = Integer.MAX_VALUE;
} }
minHeap.heapifyFromRoot(); minHeap.heapifyFromRoot();
} }
return resultingArray; return resultingArray;
} }
} }
@@ -1,22 +1,22 @@
package com.baeldung.algorithms.minheapmerge; package com.baeldung.algorithms.minheapmerge;
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import org.junit.Test; import org.junit.Test;
public class MinHeapUnitTest { public class MinHeapUnitTest {
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } }; 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 }; private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
@Test @Test
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() { public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
int[] resultArray = MinHeap.merge(inputArray); int[] resultArray = MinHeap.merge(inputArray);
assertThat(resultArray.length, is(equalTo(10))); assertThat(resultArray.length, is(equalTo(10)));
assertThat(resultArray, is(equalTo(expectedArray))); assertThat(resultArray, is(equalTo(expectedArray)));
} }
} }
+1 -1
View File
@@ -3,7 +3,7 @@
This module contains articles about Apache CXF This module contains articles about Apache CXF
## Relevant Articles: ## Relevant Articles:
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
- [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api) - [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api)
- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring) - [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
- [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf) - [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf)
+3
View File
@@ -0,0 +1,3 @@
### Relevant Articles:
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
+2 -2
View File
@@ -10,9 +10,9 @@
<parent> <parent>
<groupId>com.baeldung</groupId> <groupId>com.baeldung</groupId>
<artifactId>parent-boot-1</artifactId> <artifactId>parent-boot-2</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<relativePath>../parent-boot-1</relativePath> <relativePath>../parent-boot-2</relativePath>
</parent> </parent>
<dependencies> <dependencies>
@@ -1,11 +1,14 @@
package com.baeldung; package com.baeldung;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm; import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.session.Session; import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -1,16 +1,24 @@
package com.baeldung; package com.baeldung;
import org.apache.shiro.authc.*; import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.jdbc.JdbcRealm; import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
public class MyCustomRealm extends JdbcRealm { public class MyCustomRealm extends JdbcRealm {
@@ -1,14 +1,15 @@
package com.baeldung.shiro.permissions.custom; package com.baeldung.shiro.permissions.custom;
import com.baeldung.MyCustomRealm;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.Ini; import org.apache.shiro.config.Ini;
import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

Some files were not shown because too many files have changed in this diff Show More