diff --git a/api/current.txt b/api/current.txt index ed94018ed5143..6dda5df9acf3d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -40458,6 +40458,7 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); + method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); diff --git a/api/system-current.txt b/api/system-current.txt index 8d4186f6846c1..a8f3246c75328 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -43583,6 +43583,7 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); + method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); diff --git a/api/test-current.txt b/api/test-current.txt index 847b53fe15a58..6935738c8269c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -40539,6 +40539,7 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); + method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java index 6b45ff484e67e..58ad2fd0c5867 100644 --- a/core/java/android/util/LongSparseArray.java +++ b/core/java/android/util/LongSparseArray.java @@ -299,10 +299,39 @@ public class LongSparseArray implements Cloneable { gc(); } - for (int i = 0; i < mSize; i++) - if (mValues[i] == value) + for (int i = 0; i < mSize; i++) { + if (mValues[i] == value) { return i; + } + } + return -1; + } + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + *

Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + *

Note also that this method uses {@code equals} unlike {@code indexOfValue}. + */ + public int indexOfValueByValue(E value) { + if (mGarbage) { + gc(); + } + + for (int i = 0; i < mSize; i++) { + if (value == null) { + if (mValues[i] == null) { + return i; + } + } else { + if (value.equals(mValues[i])) { + return i; + } + } + } return -1; }