diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index 6d610f40b9..5ae3955bc8 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -12,3 +12,4 @@ This module contains articles about core features in the Java language - [Infinity in Java](https://www.baeldung.com/java-infinity) - [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) - [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) +- diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java new file mode 100644 index 0000000000..405504a965 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java @@ -0,0 +1,69 @@ +package com.baeldung.convertnumberbases; + +public class ConvertNumberBases { + + public static String convertNumberToNewBase(String number, int base, int newBase){ + return Integer.toString(Integer.parseInt(number, base), newBase); + } + public static String convertNumberToNewBaseCustom(String num, int base, int newBase) { + int decimalNumber = convertFromAnyBaseToDecimal(num, base); + return convertFromDecimalToBaseX(decimalNumber, newBase); + } + + public static String convertFromDecimalToBaseX(int num, int newBase) { + + String result = ""; + int remainder; + while (num > 0) { + remainder = num % newBase; + if (newBase == 16) { + if (remainder == 10) + result += 'A'; + else if (remainder == 11) + result += 'B'; + else if (remainder == 12) + result += 'C'; + else if (remainder == 13) + result += 'D'; + else if (remainder == 14) + result += 'E'; + else if (remainder == 15) + result += 'F'; + else + result += remainder; + } else + result += remainder; + + num /= newBase; + } + return new StringBuffer(result).reverse().toString(); + } + + public static int convertFromAnyBaseToDecimal(String num, int base) { + + if (base < 2 || (base > 10 && base != 16)) + return -1; + + int val = 0; + int power = 1; + + for (int i = num.length() - 1; i >= 0; i--) { + int digit = charToDecimal(num.charAt(i)); + + if (digit < 0 || digit >= base) + return -1; + + val += digit * power; + power = power * base; + } + + return val; + } + + public static int charToDecimal(char c) { + if (c >= '0' && c <= '9') + return (int) c - '0'; + else + return (int) c - 'A' + 10; + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java new file mode 100644 index 0000000000..eda88488f9 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java @@ -0,0 +1,20 @@ +package com.baeldung.deepshallowcopy; + +public class SchoolDeepCopy implements Cloneable{ + public String name; + public SchoolDeepCopy(String name){ + this.name = name; + } + + protected Object clone() throws CloneNotSupportedException{ + return super.clone(); + } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java new file mode 100644 index 0000000000..75258c1505 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java @@ -0,0 +1,16 @@ +package com.baeldung.deepshallowcopy; + +public class SchoolShallowCopy { + public String name; + public SchoolShallowCopy(String name){ + this.name = name; + } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java new file mode 100644 index 0000000000..293363b557 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java @@ -0,0 +1,55 @@ +package com.baeldung.deepshallowcopy; + +public class StudentDeepCopy implements Cloneable{ + public String firstName; + public String lastName; + public String level; + public SchoolDeepCopy school; + + + public StudentDeepCopy(String firstName, String lastName, String level, SchoolDeepCopy school){ + this.firstName = firstName; + this.lastName = lastName; + this.level = level; + this.school = school; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public SchoolDeepCopy getSchool() { + return school; + } + + public void setSchool(SchoolDeepCopy school) { + this.school = school; + } + @Override + protected Object clone() throws CloneNotSupportedException { + StudentDeepCopy student = (StudentDeepCopy) super.clone(); + student.school = (SchoolDeepCopy) school.clone(); + return student; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java new file mode 100644 index 0000000000..cdb2c4be86 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java @@ -0,0 +1,53 @@ +package com.baeldung.deepshallowcopy; + +public class StudentShallowCopy implements Cloneable{ + public String firstName; + public String lastName; + public String level; + public SchoolShallowCopy school; + + + public StudentShallowCopy(String firstName, String lastName, String level, SchoolShallowCopy school){ + this.firstName = firstName; + this.lastName = lastName; + this.level = level; + this.school = school; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public SchoolShallowCopy getSchool() { + return school; + } + + public void setSchool(SchoolShallowCopy school) { + this.school = school; + } + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java new file mode 100644 index 0000000000..109e1da1b2 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.convertnumberbases; + +import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBase; +import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBaseCustom; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class ConvertNumberBasesUnitTest { + + @Test + void whenConvertingBase10NumberToBase5_ThenResultShouldBeDigitsInBase5() { + assertEquals(convertNumberToNewBase("89", 10, 5), "324"); + } + @Test + void whenConvertingBase2NumberToBase8_ThenResultShouldBeDigitsInBase8() { + assertEquals(convertNumberToNewBaseCustom("11001000", 2, 8), "310"); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java new file mode 100644 index 0000000000..ce40898821 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.deepshallowcopy; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class StudentDeepCopyUnitTest { + + + @Test + void whenDeepCopying_thenCopyObjectMakesCopyOfReferencedObjectInSourceObject(){ + SchoolDeepCopy ug = new SchoolDeepCopy("University of Ghana"); + StudentDeepCopy studentOne = new StudentDeepCopy("Abena", "Kojo","200L", ug ); + StudentDeepCopy studentTwo = null; + + try{ + studentTwo = (StudentDeepCopy) studentOne.clone(); + } catch (CloneNotSupportedException e){ + e.printStackTrace(); + } + + assertNotSame(studentOne.getSchool(),studentTwo.getSchool()); + studentTwo.getSchool().setName("University of Nigeria"); + assertNotEquals(studentOne.getSchool().getName(), studentTwo.getSchool().getName()); + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java new file mode 100644 index 0000000000..6c8c9d4992 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.deepshallowcopy; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class StudentShallowCopyUnitTest { + + @Test + void whenShallowCopying_thenCopyObjectAndSourceObjectShareSameReferencedObject(){ + SchoolShallowCopy ug = new SchoolShallowCopy("University of Ghana"); + StudentShallowCopy studentOne = new StudentShallowCopy("Abena", "Kojo","200L", ug ); + StudentShallowCopy studentTwo = null; + + try{ + studentTwo = (StudentShallowCopy) studentOne.clone(); + } catch (CloneNotSupportedException e){ + e.printStackTrace(); + } + + assertSame(studentOne.getSchool(),studentTwo.getSchool()); + studentTwo.getSchool().setName("University of Nigeria"); + assertEquals(studentOne.getSchool().getName(), studentTwo.getSchool().getName()); + } + +} \ No newline at end of file