diff --git a/algorithms-modules/algorithms-twoanglesdifference/pom.xml b/algorithms-modules/algorithms-twoanglesdifference/pom.xml
new file mode 100644
index 000000000000..38f1cb17222a
--- /dev/null
+++ b/algorithms-modules/algorithms-twoanglesdifference/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ algorithms-twoanglesdifference
+ 0.0.1-SNAPSHOT
+ algorithms-twoanglesdifference
+
+
+ com.baeldung
+ algorithms-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ 21
+
+ 5.11.0
+ 3.6.1
+ 3.2.5
+
+
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.jupiter.version}
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ 3.26.0
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ ${maven.compiler.release}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.version}
+
+ false
+
+
+
+
+
+
diff --git a/algorithms-modules/algorithms-twoanglesdifference/src/main/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculator.java b/algorithms-modules/algorithms-twoanglesdifference/src/main/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculator.java
new file mode 100644
index 000000000000..0edd5d31f377
--- /dev/null
+++ b/algorithms-modules/algorithms-twoanglesdifference/src/main/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculator.java
@@ -0,0 +1,64 @@
+/**
+ * Package to host code for calculating three types of angle difference
+ */
+package com.baeldung.algorithms.twoanglesdifference;
+
+public class AngleDifferenceCalculator {
+
+ /**
+ * Normalizes an angle to be within the range [0, 360).
+ *
+ * @param angle The angle in degrees.
+ * @return The normalized angle.
+ */
+ public static double normalizeAngle(double angle) {
+ return (angle % 360 + 360) % 360;
+ }
+
+ /**
+ * Calculates the absolute difference between two angles.
+ *
+ * @param angle1 The first angle in degrees.
+ * @param angle2 The second angle in degrees.
+ * @return The absolute difference in degrees.
+ */
+ public static double absoluteDifference(double angle1, double angle2) {
+ return Math.abs(angle1 - angle2);
+ }
+
+ /**
+ * Calculates the shortest difference between two angles.
+ *
+ * @param angle1 The first angle in degrees.
+ * @param angle2 The second angle in degrees.
+ * @return The shortest difference in degrees (0 to 180).
+ */
+ public static double shortestDifference(double angle1, double angle2) {
+ double diff = absoluteDifference(normalizeAngle(angle1), normalizeAngle(angle2));
+ return Math.min(diff, 360 - diff);
+ }
+
+ /**
+ * Calculates the signed shortest difference between two angles.
+ * A positive result indicates counter-clockwise rotation, a negative result indicates clockwise.
+ *
+ * @param angle1 The first angle in degrees.
+ * @param angle2 The second angle in degrees.
+ * @return The signed shortest difference in degrees (-180 to 180).
+ */
+ public static double signedShortestDifference(double angle1, double angle2) {
+ double normalizedAngle1 = normalizeAngle(angle1);
+ double normalizedAngle2 = normalizeAngle(angle2);
+ double diff = normalizedAngle2 - normalizedAngle1;
+
+ if (diff > 180) {
+ return diff - 360;
+ } else if (diff < -180) {
+ return diff + 360;
+ } else {
+ return diff;
+ }
+ }
+}
+
+
diff --git a/algorithms-modules/algorithms-twoanglesdifference/src/test/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculatorTest.java b/algorithms-modules/algorithms-twoanglesdifference/src/test/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculatorTest.java
new file mode 100644
index 000000000000..1539c6b9e37b
--- /dev/null
+++ b/algorithms-modules/algorithms-twoanglesdifference/src/test/java/com/baeldung/algorithms/twoanglesdifference/AngleDifferenceCalculatorTest.java
@@ -0,0 +1,47 @@
+/**
+ * Package to host JUnit Test code for AngleDifferenceCalculator Class
+ */
+package com.baeldung.algorithms.twoanglesdifference;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+
+
+class AngleDifferenceCalculatorTest {
+
+ private static final double EPSILON = 0.0001;
+
+ @Test
+ void whenNormalizingAngle_thenReturnsCorrectRange() {
+ assertEquals(90, AngleDifferenceCalculator.normalizeAngle(450), EPSILON);
+ assertEquals(30, AngleDifferenceCalculator.normalizeAngle(390), EPSILON);
+ assertEquals(330, AngleDifferenceCalculator.normalizeAngle(-30), EPSILON);
+ assertEquals(0, AngleDifferenceCalculator.normalizeAngle(360), EPSILON);
+ }
+
+ @Test
+ void whenCalculatingAbsoluteDifference_thenReturnsCorrectValue() {
+ assertEquals(100, AngleDifferenceCalculator.absoluteDifference(10, 110), EPSILON);
+ assertEquals(290, AngleDifferenceCalculator.absoluteDifference(10, 300), EPSILON);
+ assertEquals(30, AngleDifferenceCalculator.absoluteDifference(-30, 0), EPSILON);
+ }
+
+ @Test
+ void whenCalculatingShortestDifference_thenReturnsCorrectValue() {
+ assertEquals(100, AngleDifferenceCalculator.shortestDifference(10, 110), EPSILON);
+ assertEquals(70, AngleDifferenceCalculator.shortestDifference(10, 300), EPSILON);
+ assertEquals(30, AngleDifferenceCalculator.shortestDifference(-30, 0), EPSILON);
+ assertEquals(0, AngleDifferenceCalculator.shortestDifference(360, 0), EPSILON);
+ }
+
+ @Test
+ void whenCalculatingSignedShortestDifference_thenReturnsCorrectValue() {
+ assertEquals(100, AngleDifferenceCalculator.signedShortestDifference(10, 110), EPSILON);
+ assertEquals(-70, AngleDifferenceCalculator.signedShortestDifference(10, 300), EPSILON);
+ assertEquals(30, AngleDifferenceCalculator.signedShortestDifference(-30, 0), EPSILON);
+ assertEquals(70, AngleDifferenceCalculator.signedShortestDifference(300, 10), EPSILON);
+ }
+}
+
diff --git a/algorithms-modules/pom.xml b/algorithms-modules/pom.xml
index be78261bb788..28aea55eada3 100644
--- a/algorithms-modules/pom.xml
+++ b/algorithms-modules/pom.xml
@@ -30,6 +30,7 @@
algorithms-sorting
algorithms-sorting-2
algorithms-sorting-3
+ algorithms-twoanglesdifference
diff --git a/pom.xml b/pom.xml
index d1c3684de872..dae917ff1966 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,4 +1,4 @@
-
+
}
+ *
+ * @param value
+ * Java instance representing xml element's value.
+ * @return
+ * the new instance of {@link JAXBElement }{@code <}{@link UserRequest }{@code >}
+ */
+ @XmlElementDecl(namespace = "http://www.baeldung.com/jaxb/gen", name = "userRequest")
+ public JAXBElement createUserRequest(UserRequest value) {
+ return new JAXBElement(_UserRequest_QNAME, UserRequest.class, null, value);
+ }
+
+ /**
+ * Create an instance of {@link JAXBElement }{@code <}{@link UserResponse }{@code >}
+ *
+ * @param value
+ * Java instance representing xml element's value.
+ * @return
+ * the new instance of {@link JAXBElement }{@code <}{@link UserResponse }{@code >}
+ */
+ @XmlElementDecl(namespace = "http://www.baeldung.com/jaxb/gen", name = "userResponse")
+ public JAXBElement createUserResponse(UserResponse value) {
+ return new JAXBElement(_UserResponse_QNAME, UserResponse.class, null, value);
+ }
+
}
diff --git a/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java b/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
index 7ba9064e9ea8..a2bb28f0b884 100644
--- a/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
+++ b/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
@@ -1,11 +1,9 @@
package com.baeldung.jaxb.gen;
-import java.io.Serializable;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
-import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
@@ -34,12 +32,8 @@
"id",
"name"
})
-@XmlRootElement(name = "userRequest")
-public class UserRequest
- implements Serializable
-{
+public class UserRequest {
- private final static long serialVersionUID = -1L;
protected int id;
@XmlElement(required = true)
protected String name;
diff --git a/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java b/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
index f35b001a689c..e398b639b08b 100644
--- a/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
+++ b/xml-modules/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
@@ -1,16 +1,12 @@
package com.baeldung.jaxb.gen;
-import java.io.Serializable;
-import java.util.Calendar;
+import javax.xml.datatype.XMLGregorianCalendar;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
-import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlSchemaType;
import jakarta.xml.bind.annotation.XmlType;
-import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.w3._2001.xmlschema.Adapter1;
/**
@@ -42,21 +38,16 @@
"gender",
"created"
})
-@XmlRootElement(name = "userResponse")
-public class UserResponse
- implements Serializable
-{
+public class UserResponse {
- private final static long serialVersionUID = -1L;
protected int id;
@XmlElement(required = true)
protected String name;
@XmlElement(required = true)
protected String gender;
- @XmlElement(required = true, type = String.class)
- @XmlJavaTypeAdapter(Adapter1 .class)
+ @XmlElement(required = true)
@XmlSchemaType(name = "dateTime")
- protected Calendar created;
+ protected XMLGregorianCalendar created;
/**
* Gets the value of the id property.
@@ -127,10 +118,10 @@ public void setGender(String value) {
*
* @return
* possible object is
- * {@link String }
+ * {@link XMLGregorianCalendar }
*
*/
- public Calendar getCreated() {
+ public XMLGregorianCalendar getCreated() {
return created;
}
@@ -139,10 +130,10 @@ public Calendar getCreated() {
*
* @param value
* allowed object is
- * {@link String }
+ * {@link XMLGregorianCalendar }
*
*/
- public void setCreated(Calendar value) {
+ public void setCreated(XMLGregorianCalendar value) {
this.created = value;
}