diff --git a/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt b/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt index 7a8901081..3bfc6cda7 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt @@ -47,6 +47,7 @@ open class NonHierarchicalDistanceBasedAlgorithm : AbstractAlgo */ @JvmField protected val mItems: MutableCollection> = LinkedHashSet() + protected val mItemMap = HashMap>() /** * Any modifications should be synchronized on mQuadTree. @@ -61,6 +62,7 @@ open class NonHierarchicalDistanceBasedAlgorithm : AbstractAlgo synchronized(mQuadTree) { val result = mItems.add(quadItem) if (result) { + mItemMap[item] = quadItem mQuadTree.add(quadItem) } return result @@ -81,6 +83,7 @@ open class NonHierarchicalDistanceBasedAlgorithm : AbstractAlgo override fun clearItems() { synchronized(mQuadTree) { mItems.clear() + mItemMap.clear() mQuadTree.clear() } } @@ -88,9 +91,9 @@ open class NonHierarchicalDistanceBasedAlgorithm : AbstractAlgo override fun removeItem(item: T): Boolean { // QuadItem delegates hashcode() and equals() to its item so, // removing any QuadItem to that item will remove the item - val quadItem = QuadItem(item) synchronized(mQuadTree) { - val result = mItems.remove(quadItem) + val quadItem = mItemMap.remove(item) + val result = quadItem != null && mItems.remove(quadItem) if (result) { mQuadTree.remove(quadItem) } @@ -104,8 +107,8 @@ open class NonHierarchicalDistanceBasedAlgorithm : AbstractAlgo for (item in items) { // QuadItem delegates hashcode() and equals() to its item so, // removing any QuadItem to that item will remove the item - val quadItem = QuadItem(item) - val individualResult = mItems.remove(quadItem) + val quadItem = mItemMap.remove(item) + val individualResult = quadItem != null && mItems.remove(quadItem) if (individualResult) { mQuadTree.remove(quadItem) result = true diff --git a/clustering/src/test/java/com/google/maps/android/clustering/QuadItemTest.java b/clustering/src/test/java/com/google/maps/android/clustering/QuadItemTest.java index 7661da02a..a0010af8e 100644 --- a/clustering/src/test/java/com/google/maps/android/clustering/QuadItemTest.java +++ b/clustering/src/test/java/com/google/maps/android/clustering/QuadItemTest.java @@ -98,7 +98,7 @@ public void testInsertionOrder() { } private static class TestingItem implements ClusterItem { - private final LatLng mPosition; + private LatLng mPosition; private String mTitle; TestingItem(String title, double lat, double lng) { @@ -110,6 +110,9 @@ private static class TestingItem implements ClusterItem { mTitle = ""; mPosition = new LatLng(lat, lng); } + public void setPosition(double lat, double lng) { + mPosition = new LatLng(lat, lng); + } @NonNull @Override