diff --git a/primitiveCollections/src/main/java/org/lucares/collections/IntList.java b/primitiveCollections/src/main/java/org/lucares/collections/IntList.java index 8338258..9745ac2 100644 --- a/primitiveCollections/src/main/java/org/lucares/collections/IntList.java +++ b/primitiveCollections/src/main/java/org/lucares/collections/IntList.java @@ -566,12 +566,20 @@ public final class IntList implements Serializable, Cloneable { * if offset is negative, or larger than the size of the list */ public int indexOf(final int value, final int offset) { - for (int i = offset; i < index; i++) { - if (data[i] == value) { - return i; + + int result = -1; + if (sorted) { + final int insertionPoint = Arrays.binarySearch(data, offset, size(), value); + result = insertionPoint < 0 ? -1 : insertionPoint; + } else { + for (int i = offset; i < index; i++) { + if (data[i] == value) { + result = i; + break; + } } } - return -1; + return result; } @Override diff --git a/primitiveCollections/src/test/java/org/lucares/collections/IntListTest.java b/primitiveCollections/src/test/java/org/lucares/collections/IntListTest.java index f123be5..3daf536 100644 --- a/primitiveCollections/src/test/java/org/lucares/collections/IntListTest.java +++ b/primitiveCollections/src/test/java/org/lucares/collections/IntListTest.java @@ -604,7 +604,7 @@ public class IntListTest { } @Test - public void testIndexOf() { + public void testIndexOfOnSortedList() { final IntList list = new IntList(); Assert.assertEquals(-1, list.indexOf(0)); @@ -619,7 +619,28 @@ public class IntListTest { } @Test - public void testIndexOfWithOffset() { + public void testIndexOfOnUnsortedList() { + final IntList list = IntList.of(2, 0, 1); + Assert.assertEquals(1, list.indexOf(0)); + + Assert.assertEquals(0, list.indexOf(2)); + Assert.assertEquals(2, list.indexOf(1)); + Assert.assertEquals(-1, list.indexOf(3)); + } + + @Test + public void testIndexOfWithOffsetOnSortedList() { + final IntList list = new IntList(); + list.addAll(1, 1, 2, 3, 3); + Assert.assertEquals(0, list.indexOf(1, 0)); + Assert.assertEquals(1, list.indexOf(1, 1)); + Assert.assertEquals(2, list.indexOf(2, 2)); + Assert.assertEquals(-1, list.indexOf(2, 3)); + Assert.assertEquals(3, list.indexOf(3, 2)); + } + + @Test + public void testIndexOfWithOffsetOnUnsortedList() { final IntList list = new IntList(); list.addAll(0, 2, 0, 2); Assert.assertEquals(1, list.indexOf(2, 0));