fix LongLongHashMap.forEachOrdered for negative values
This commit is contained in:
@@ -283,6 +283,9 @@ public class LongLongHashMap {
|
|||||||
consumer.accept(key, get(key));
|
consumer.accept(key, get(key));
|
||||||
} else if (key == EMPTY_SLOT) {
|
} else if (key == EMPTY_SLOT) {
|
||||||
final int posFirstKey = findPosOfFirstPositiveKey(sortedKeys);
|
final int posFirstKey = findPosOfFirstPositiveKey(sortedKeys);
|
||||||
|
if (posFirstKey < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
i = posFirstKey - 1;
|
i = posFirstKey - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,6 +131,54 @@ public class LongLongHashMapTest {
|
|||||||
actualOrderOfKeys.add(k);
|
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");
|
Assertions.assertTrue(actualOrderOfKeys.isSorted(), "keys are sorted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user