From b16ac2c2957560ac46d10e57f5f7a8b600f3c8b3 Mon Sep 17 00:00:00 2001 From: dvasylev Date: Fri, 22 Oct 2021 21:08:50 +0300 Subject: [PATCH 1/4] Initial commit --- pom.xml | 6 + .../opensource/longmap/LongMapImpl.java | 149 +++++++++++++++++- .../opensource/longmap/LongMapImplTest.java | 137 ++++++++++++++++ .../comparus/opensource/longmap/Render.java | 16 ++ 4 files changed, 302 insertions(+), 6 deletions(-) create mode 100644 src/main/java/de/comparus/opensource/longmap/LongMapImplTest.java create mode 100644 src/main/java/de/comparus/opensource/longmap/Render.java diff --git a/pom.xml b/pom.xml index 36c092b..a4c733f 100644 --- a/pom.xml +++ b/pom.xml @@ -32,5 +32,11 @@ 4.12 test + + org.junit.jupiter + junit-jupiter + RELEASE + compile + diff --git a/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java b/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java index 2f0b54b..bb1e86f 100644 --- a/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java +++ b/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java @@ -1,43 +1,180 @@ package de.comparus.opensource.longmap; public class LongMapImpl implements LongMap { + private Node node; + private int size; + private V[] values; + + private static class Node { + private long key; + private V value; + private Node next; + + public Node(long key, V value) { + this.value = value; + this.key = key; + this.next = next; + } + + @Override + public String toString() { + return "Node{" + + "key=" + key + + ", value=" + value + + ", next=" + next + + '}'; + } + } + + @Override public V put(long key, V value) { - return null; + if (node == null) { + node = new Node(key, value); + size++; + return value; + } + writeToNext(key, value); + return value; + } + + private Node writeToNext(long key, V value) { + Node bufferNode = node; + while (bufferNode.next != null) { + bufferNode = bufferNode.next; + } + bufferNode.next = new Node(key, value); + size++; + return bufferNode; } + @Override public V get(long key) { + Node bufferNode = node; + if (node == null) return null; + if (node.key == key) return node.value; + while (bufferNode.next != null) { + if (bufferNode.next.key == key) { + return bufferNode.next.value; + } + bufferNode = bufferNode.next; + } return null; } + @Override public V remove(long key) { - return null; + if (node == null) return null; + if (node.key == key) { + V temp = node.value; + node = node.next; + size--; + //node = null; + return temp; + } + return searchInNext(key); } + private V searchInNext(long key) { + Node bufferNode = node; + V temp = node.value; + while (bufferNode.next != null) { + if (bufferNode.next.key == key) { + temp = bufferNode.next.value; + bufferNode.next = bufferNode.next.next; + size--; + return temp; + } + bufferNode = bufferNode.next; + } + return temp; + } + + @Override public boolean isEmpty() { - return false; + return size == 0; } + @Override public boolean containsKey(long key) { + Node bufferNode = node; + if (node == null) return false; + if (node.key == key) return true; + while (bufferNode.next != null) { + if (bufferNode.next.key == key) { + return true; + } + bufferNode = bufferNode.next; + } return false; } + @Override public boolean containsValue(V value) { + Node bufferNode = node; + if (node == null) return false; + if (node.value == value) return true; + while (bufferNode.next != null) { + if (bufferNode.next.value == value) { + return true; + } + bufferNode = bufferNode.next; + } return false; } + @Override public long[] keys() { - return null; + long[] keys = new long[size]; + int index = 0; + Node bufferNode = node; + keys[index] = bufferNode.key; + index++; + while (bufferNode.next != null) { + keys[index] = bufferNode.next.key; + index++; + bufferNode = bufferNode.next; + } + return keys; } + @Override public V[] values() { - return null; + int index = 0; + Node bufferNode = node; + values[index] = bufferNode.value; + index++; + while (bufferNode.next != null) { + values[index] = bufferNode.next.value; + index++; + bufferNode = bufferNode.next; + } + return values; + } + + public void setArray(V[] values) { + this.values = values; } + @Override public long size() { - return 0; + return size; } + @Override public void clear() { + if (node == null) return; + Node bufferNode = node; + while (bufferNode.next != null) { + bufferNode.next = bufferNode.next.next; + } + node = node.next; + size = 0; + } + @Override + public String toString() { + return "LongMapImpl{" + + node + + '}'; } } diff --git a/src/main/java/de/comparus/opensource/longmap/LongMapImplTest.java b/src/main/java/de/comparus/opensource/longmap/LongMapImplTest.java new file mode 100644 index 0000000..7752edb --- /dev/null +++ b/src/main/java/de/comparus/opensource/longmap/LongMapImplTest.java @@ -0,0 +1,137 @@ +package de.comparus.opensource.longmap; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class LongMapImplTest { + Render render = new Render(); + + @Test + public void customTestMap() { + LongMapImpl longMap = new LongMapImpl<>(); + longMap.put(11, "A"); + longMap.put(22, "B"); + longMap.put(33, "C"); + longMap.put(44, "D"); + longMap.put(55, "E"); + longMap.put(66, "F"); + longMap.put(77, "G"); + System.out.println(longMap); + System.out.println(longMap.size()); + longMap.remove(44); + System.out.println(longMap); + System.out.println(longMap.size()); + System.out.println(longMap.isEmpty()); + System.out.println(longMap.containsKey(77)); + System.out.println(longMap.containsValue("D")); + render.printKeys(longMap); + render.printStringValues(longMap); + longMap.clear(); + System.out.println(longMap); + System.out.println(longMap.size()); + } + + @Test + public void testPut() { + LongMapImpl testMap = new LongMapImpl<>(); + assertEquals("1", testMap.put(11, "1")); + assertEquals("2", testMap.put(22, "2")); + assertEquals("3", testMap.put(33, "3")); + assertEquals("4", testMap.put(44, "4")); + } + + @Test + public void testGet() { + LongMapImpl testMap = new LongMapImpl<>(); + assertEquals(testMap.put(11, "1"), testMap.get(11)); + assertEquals(testMap.put(22, "2"), testMap.get(22)); + assertEquals(testMap.put(33, "3"), testMap.get(33)); + assertEquals(testMap.put(44, "4"), testMap.get(44)); + } + + @Test + public void testRemove() { + LongMapImpl testMap = new LongMapImpl<>(); + assertNull(testMap.remove(123)); + testMap.put(11, "1"); + testMap.put(22, "2"); + assertEquals(testMap.put(11, "1"), testMap.remove(11)); + } + + @Test + public void testIsEmpty() { + LongMapImpl testMap = new LongMapImpl<>(); + assertTrue(testMap.isEmpty()); + testMap.put(11, "1"); + assertFalse(testMap.isEmpty()); + } + + @Test + public void testContainsKey() { + LongMapImpl testMap = new LongMapImpl<>(); + assertFalse(testMap.containsKey(22)); + testMap.put(11, "11"); + assertTrue(testMap.containsKey(11)); + } + + @Test + public void testContainsValue() { + LongMapImpl testMap = new LongMapImpl<>(); + assertFalse(testMap.containsValue("22")); + testMap.put(11, "11"); + assertTrue(testMap.containsValue("11")); + } + + @Test + public void testKeys() { + LongMapImpl testMap = new LongMapImpl<>(); + long[] exptd = new long[]{11, 22, 33, 44}; + long[] actl; + testMap.put(11, "1"); + testMap.put(22, "2"); + testMap.put(33, "3"); + testMap.put(44, "3"); + actl = testMap.keys(); + Assertions.assertArrayEquals(exptd, actl); + } + + @Test + public void testValues() { + Integer[] exptd = new Integer[16]; + LongMapImpl testMap = new LongMapImpl<>(); + for (int index = 0; index < 16; index++) { + testMap.put(index, index); + exptd[index] = index; + } + testMap.setArray(exptd); + Assertions.assertArrayEquals(exptd, testMap.values()); + } + + @Test + public void testSize() { + LongMapImpl testMap = new LongMapImpl<>(); + testMap.put(11, "1"); + assertEquals(1, testMap.size()); + testMap.put(22, "2"); + assertEquals(2, testMap.size()); + testMap.put(33, "3"); + assertEquals(3, testMap.size()); + testMap.put(44, "4"); + assertEquals(4, testMap.size()); + } + + @Test + public void testClear() { + LongMapImpl testMap = new LongMapImpl<>(); + testMap.put(11, "1"); + testMap.put(22, "2"); + assertNotEquals(0, testMap.size()); + testMap.clear(); + assertEquals(0, testMap.size()); + } +} diff --git a/src/main/java/de/comparus/opensource/longmap/Render.java b/src/main/java/de/comparus/opensource/longmap/Render.java new file mode 100644 index 0000000..6cbaf78 --- /dev/null +++ b/src/main/java/de/comparus/opensource/longmap/Render.java @@ -0,0 +1,16 @@ +package de.comparus.opensource.longmap; + +public class Render { + public void printStringValues(LongMapImpl longMap){ + longMap.setArray(new String[(int)longMap.size()]); + for(String line: longMap.values()) { + System.out.println(line); + } + } + + public void printKeys(LongMapImpl longMap){ + for(long index: longMap.keys()) { + System.out.println(index); + } + } +} From c9b5c4c6ca24ce237b2af1b5aa6895c8ed64d72d Mon Sep 17 00:00:00 2001 From: dvasylev Date: Fri, 22 Oct 2021 21:10:09 +0300 Subject: [PATCH 2/4] Initial commit --- .../opensource/longmap/LongMapImpl.class | Bin 0 -> 4796 bytes .../opensource/longmap/LongMapImplTest.class | Bin 0 -> 4471 bytes .../de/comparus/opensource/longmap/Render.class | Bin 0 -> 1422 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 target/classes/de/comparus/opensource/longmap/LongMapImpl.class create mode 100644 target/classes/de/comparus/opensource/longmap/LongMapImplTest.class create mode 100644 target/classes/de/comparus/opensource/longmap/Render.class diff --git a/target/classes/de/comparus/opensource/longmap/LongMapImpl.class b/target/classes/de/comparus/opensource/longmap/LongMapImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d142461d2fa6cd073c4c6afa9091c5af3c3d0c06 GIT binary patch literal 4796 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 literal 0 HcmV?d00001 From 1473ad45e44dc0cfccde9b8a014ef7876ef33139 Mon Sep 17 00:00:00 2001 From: Danyyl Vasylev Date: Fri, 22 Oct 2021 21:30:44 +0300 Subject: [PATCH 3/4] Update LongMapImpl.java --- src/main/java/de/comparus/opensource/longmap/LongMapImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java b/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java index bb1e86f..97e4fe2 100644 --- a/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java +++ b/src/main/java/de/comparus/opensource/longmap/LongMapImpl.java @@ -68,7 +68,6 @@ public V remove(long key) { V temp = node.value; node = node.next; size--; - //node = null; return temp; } return searchInNext(key); From c8fbb9f4d12d9f6d23fad1195e94b014d76ec18a Mon Sep 17 00:00:00 2001 From: Danyyl Vasylev Date: Mon, 25 Oct 2021 17:30:10 +0300 Subject: [PATCH 4/4] Delete target/classes/de/comparus/opensource/longmap directory --- .../opensource/longmap/LongMapImpl.class | Bin 4796 -> 0 bytes .../opensource/longmap/LongMapImplTest.class | Bin 4471 -> 0 bytes .../de/comparus/opensource/longmap/Render.class | Bin 1422 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 target/classes/de/comparus/opensource/longmap/LongMapImpl.class delete mode 100644 target/classes/de/comparus/opensource/longmap/LongMapImplTest.class delete mode 100644 target/classes/de/comparus/opensource/longmap/Render.class diff --git a/target/classes/de/comparus/opensource/longmap/LongMapImpl.class b/target/classes/de/comparus/opensource/longmap/LongMapImpl.class deleted file mode 100644 index d142461d2fa6cd073c4c6afa9091c5af3c3d0c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4796 zcmbVQ-)~gM75--Tt{1O&`C*K~*x1AYv%ALF5XZq@LjfmX8?%tu*fF$euGbf{u-@J5 z4?pT@g1X~5wHig#c_VGD)9ZzF$(qR}t(y$Q=?%5ijYb@652FKn6hdYyWfhD21_lNc7Nd3R ziq(BWtapX67f*SuA5nO}e(QA`|9b8|9mYQFuey6!f;CvbyRk_De;|w~VpVNNMB58r zLtAY|N$T{5aS(k9;i6?0QdcLkI(K$NCu6k-q?-D}7{Fnc*$p#Owu%bdFV_kN@r=UG zY6?%63hC_9sd75AXca;@0{jMgn)9IzG zSt=J;)gddD;&_5>;W8&2#_ZO$Wh$MulI7(Et1x3OWT?1#Dwi@dvt}VJKRb&? z>1vup9<0MCZL~hB>W#dsuAYYJ`t8q`*|836+_9>8ba8w%EP?grHw zC2Kja5KI?eSk9N|H*cm(?AEDVwq&NW#j}FN;4v;n+{IZbFNGc60&vrqat%>|z=^>~ zkUS$AyUb|#X^oT=3G26yOHft5eGG?(T4agAk@DzKK z4{VL_bL4H$`5C?$d>H3{-kJ8Ct*f#=fi0Z#8Nu%)cTaLu90Tz?P#<&R$60=5Tjo>z zic$*T9FiQ*KeBRxKPkM3muODZeaMpr$5{Lm1n;9G{wX5!U43`3{qp)F{+|8pv7lOR^T8OL@-JI>i0qnQk*h_b)*l|N<)0nYci{T<>xht-< z(h)5suF32o=D7DV=YFWYPI%@i#@B=6^$ zE;{F`K-!GQ0mP^)j?L(${ysW?h{5l-0mSXd3|0UPRsak-02(NLiSagUC>pTHYbYWm zP_)!Ir36$Xd=JnNL}Z%-?J{HXO`6t({FP!t$Qgl_)T{*5noRDZyX(CV(4^-*YkfBA zE*ab{J=a^wm4|;?GdabzQS-448DTu*ja5^>Q<#5;&rVRbV9 zK-U_1+wH*f*h3&uoaP-nPOy^|NPDmo-?p<37^#38alpBmsHKE7EhXTDGy}fIcm<13 zULy`)|KXmbqD__kxr?3=Lvu6i;by12#I!)}-2pFpp!+U7cA@(jZu>bVnsejH<5^Y!zoRiOe z1YA5ly&r*a4%%>b$-um-uAN(X_(ctx*NCP-G)1(d!~!ofOK%X-O_utb9yG%hG{bfy zllx`RM&t7|GLaHAbkJ^Ou9VzVk`t9O4{vuf;tKICF@Tz{zd3vj5nA(~nx_261Y@$d zgXDByxaCutt6lbjv@my#RDIFAMiV-9bP0Tqh5mh(`CA0|1D3%L*{^T$`gxmO>_;rf z9}~h)JS8yXfDAGKOGwkFMuy`WPx`1KT0@@53tYYDk{5yRE9?s5x?(?Tr;-8Yg{JQ_ zk|*>X^^dv)9%?61J=3?8(!8~E!(J2e++|Yt4_U7Q?4fJGJJkCwLH-om@H5`1KPQX7 zprh~cYI+~f;Flf-k2>Id>;VFa&mU&3Tt%8eeXEL;K+=0IZ~WuLmuL|@olZwv=J_mg z4z5caJvl$r~&+nx$pHt_8)scV9@Wj{o-K;699xg`KHhyO5fD zWwifw&aFKBm-mkGvk41YopkzM`3*14kJ$ZI=UUnkU@hOhX-@#z>v+Hvz|2d>tnx nYrOGU^Tema;i4KJS&3nT*JYT_mY5)wnSFf2nHvNv{TLjt0$ zg4(LJ7kkyVPwUg#*0xrwOBA$X@Ajwu5&b9ngYA3fwwp|zhlj$$&iT%q?|kojZr||v z7ax5BU^_mqLlr_{RBNcgDg}|V`kWq5>6w}M;ZtXgq@`e0znL+uT?#_6_K7f51+Axz zcru&L>G@(Ip3NDVLbjMs8u3&%Gn3YH@uNoOw2`kv7@=C!LknZIhTG7fp!+5}6Z9~w z=LXZc)VNWQ!}GQ;1#O9&Y;_Lp3uBFfj+@w498-q~LN$zq{Ha&btUwtMe!HDcSyq{7_`%v z&d$-YiEn~V#pRw zkLx)zK2RtadCSaZ2u#!M#es80J;i0)3Q1al=Y)zB&+Ape#46iVmBQZ1ZSxDvVy9f9u?2> z+1o3}UDj{~&of=Kc9^SU?bEECGk8(MSMfE*&e=bZ&+7{w$8c+G)_u*j1 zGG=7byo9f7copAZ`OHbO51&!c92=}GHP@Cs5W%-Jd>gMRPz#1-A0*b(D@9GLzpLSU z_&$r+cFmAC5p&R3Nc>Ppysn^qC2uS2k+M01A4&3m%)*Ebk))S{Do^moQ?(fXLc?2P z+~8&(KA?IP+a|?d@D>C79T;DGGzVm1?W0`4V!Yr61 zJ&?&{E#2*)yAmsRnaeM1k=dwBQCo62itdm>U7bir4QHIy%VN+QSPin;S2>f`RBGHY zq>9d&F*U|~&f*xTnjT_9=t+w$YWsJF1}nnkO*+p`Wq&qS){j@s3I_hqSa}{KSgXe@ zJvmFFc5Q_58Cye8j@i?_)+Qk{i|EGetNx%Vb=6og0mo_HEuD!?yz;AfnJWCpOP{|Q zWqw`o_m^DlLdbp>>9`7|;~K(KS5f-`>fYtMD*TGS@=e0a7}ebQYf7>oY{a+m8$K2M zmcFXQmoiNovAuB(5xR*cIvcSz+El{rla$s+TU=>lbdxJ>j<&i|TeRJkI-^@%DIV<+ z={;=gEMbT9*j>UtI@?^r!QczWWT=D@ks1*%;fTACgN{+|cpr82HswB_pnNiLfRGQ_ zwZQO%*uo)%Xi%-#N2ea7;m>WzLAL4hkQSf`7DuH%1?^1e?8cEt8_*C$|7j$~B zv3(49L60WwuqPS1MHtapJM^>eD$Ui#Xxd$6x!N4fI;%42b#xB2^Y9K*>?GVS^kOUa zpt}O}fDd{HK3E1?G(pfMAM`tJr5y7>`;bK_;T(}uS|1hMBKRr?JXITgmBWB47KLnF zPNbJawlOc;3IBe6DLsI3ey>R>JJCPp6B!N=5lxWDRiDUfE|HxTL@d_kBIXEaZB(-0 z6u&SL$|o%_Xm|Q(djn`i6GXe{qdo7U-Q=S!VQ3Kx zKCDT$0~Jq|L)gsn0?S;*0ZxyDEb~Jw=SM04Nny(*Q2B0o9f&3f=tCdSB^OYe56I5- z5kjyrJ>vz9jZB=&VI_FzFk>~sSRH1pMk`>o`LH$yV2LIO>mwi5MHg194=ef=j*q3N zq69}(0Ms}^9pku|V98CgcOI(%)#`(434jt!5Y#mv)W4XCYQ}le0~NkrKNVsfjZRfF zYNJy%Y>LsTRqTV&;fjoUZ6w9#bdN}z?I9rfer}{|>mpt#$94;9dCcRa@dV+YVAq_) zL(s98AIu3PaRjGH&ai29IFNi=hh19tvg5AfV@{?cB=8BPP{m9Wt02`s`c(f(uR^sy z68RV}C0xS8prS(C&Ib?DQ*xk5xC4&acW%0XPmsZagUUFmCwh~ z{E3=Bb4LTJzCa|5zl0G{{=;iv>EQmWPx1!g$!+Q9vz#-zp>{9g4QiYbIN6AwlyzmGocco0PZK^2OI5W)<7 zTYQJ>Cbug3(~T`rb{WD;hGn=phF~gPilPe<6;Tb{&={sRgFb{4dJ}t8zxx>3U-;BCGHq< z-7+ffOM`SL3;&fp%h2x?<=0SZwO&u16n^M7(D@OhNpuqF-|4p6LT!^*h^`Jp<}_*P zwzL=6toRY5}R4nc`9I9gVH02+gU$!LTHTJQ04MGN; zs`Y;5%;E&`HCfnTf^e)u5-_Wy*UYZVmM`A6rmkZ7-F=gaE z5}BAXyBPY6p`p+&M&Bsx!|$I`O!36x#6tum6h;y%r4Exs#1kJQi6lMzIm~-rb1e)K z#R6^-&TWeI5v663ELpPjAh3^N6$!?EVF*iP3g8ZH<__rJQEHX!Ng|%;#MKuhZk%w_ towx&pEhQ5qGD_nFdJj+&gnAdt9%}LcHF*S8TG~*%RjhQPu6oe-{{XbiOr`(;