Merge branch 'master' of https://github.com/eugenp/tutorials into ABA_problem
This commit is contained in:
@@ -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)
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
+13
-13
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+88
-88
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+22
-22
@@ -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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
|
||||||
@@ -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
Reference in New Issue
Block a user