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; }