From 452ef2020d5915f3ccd220b751d0db256e362b9a Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 7 Sep 2019 16:51:30 +0200 Subject: [PATCH] fix LongLongHashMap.forEachOrdered for negative values --- .../lucares/collections/LongLongHashMap.java | 3 ++ .../collections/LongLongHashMapTest.java | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/primitiveCollections/src/main/java/org/lucares/collections/LongLongHashMap.java b/primitiveCollections/src/main/java/org/lucares/collections/LongLongHashMap.java index 466f01c..ede03fa 100644 --- a/primitiveCollections/src/main/java/org/lucares/collections/LongLongHashMap.java +++ b/primitiveCollections/src/main/java/org/lucares/collections/LongLongHashMap.java @@ -283,6 +283,9 @@ public class LongLongHashMap { consumer.accept(key, get(key)); } else if (key == EMPTY_SLOT) { final int posFirstKey = findPosOfFirstPositiveKey(sortedKeys); + if (posFirstKey < 0) { + return; + } i = posFirstKey - 1; } } diff --git a/primitiveCollections/src/test/java/org/lucares/collections/LongLongHashMapTest.java b/primitiveCollections/src/test/java/org/lucares/collections/LongLongHashMapTest.java index 9589236..92fdb1e 100644 --- a/primitiveCollections/src/test/java/org/lucares/collections/LongLongHashMapTest.java +++ b/primitiveCollections/src/test/java/org/lucares/collections/LongLongHashMapTest.java @@ -131,6 +131,54 @@ public class LongLongHashMapTest { actualOrderOfKeys.add(k); }); + Assertions.assertTrue(actualOrderOfKeys.isSorted(), "keys are sorted"); + Assertions.assertEquals(LongList.intersection(actualOrderOfKeys, entries).size(), entries.size(), + "all keys were visited"); + final LongList additionalKeys = new LongList(actualOrderOfKeys); + additionalKeys.removeAll(entries); + Assertions.assertEquals(additionalKeys, LongList.of(), "no additional keys were visited"); + } + + @Test + public void testForEachOrderedOnlyNegativeValues() { + final LongLongHashMap map = new LongLongHashMap(); + final LongList entries = LongList.of(LongStream.range(-20, -5).toArray()); + + entries.stream().forEachOrdered(l -> { + map.put(l, 2 * l); + }); + + final LongList actualOrderOfKeys = new LongList(); + map.forEachOrdered((k, v) -> { + Assertions.assertEquals(k * 2, v, "value is key*2"); + Assertions.assertTrue(entries.indexOf(k) >= 0, "value " + k + " in entries: " + entries); + actualOrderOfKeys.add(k); + }); + + Assertions.assertTrue(actualOrderOfKeys.isSorted(), "keys are sorted"); + Assertions.assertEquals(LongList.intersection(actualOrderOfKeys, entries).size(), entries.size(), + "all keys were visited"); + final LongList additionalKeys = new LongList(actualOrderOfKeys); + additionalKeys.removeAll(entries); + Assertions.assertEquals(additionalKeys, LongList.of(), "no additional keys were visited"); + } + + @Test + public void testForEachOrderedOnlyNegativeValues2() { + final LongLongHashMap map = new LongLongHashMap(); + final LongList entries = LongList.of(LongStream.range(-20, -5).toArray()); + + entries.stream().forEachOrdered(l -> { + map.put(l, 2 * l); + }); + + final LongList actualOrderOfKeys = new LongList(); + map.forEachOrdered((k, v) -> { + Assertions.assertEquals(k * 2, v, "value is key*2"); + Assertions.assertTrue(entries.indexOf(k) >= 0, "value " + k + " in entries: " + entries); + actualOrderOfKeys.add(k); + }); + Assertions.assertTrue(actualOrderOfKeys.isSorted(), "keys are sorted"); }