From 84e47bd0c41a762ae17aa4f74472b7858534a676 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Mon, 26 Sep 2016 09:21:25 +0100 Subject: [PATCH] JAL-98 generalised increment() to add() and made faster --- src/jalview/ext/android/SparseIntArray.java | 32 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/jalview/ext/android/SparseIntArray.java b/src/jalview/ext/android/SparseIntArray.java index 0e05803..4ddf776 100644 --- a/src/jalview/ext/android/SparseIntArray.java +++ b/src/jalview/ext/android/SparseIntArray.java @@ -348,21 +348,43 @@ public class SparseIntArray implements Cloneable } /** - * Method added for Jalview to increment a key's value if present, else add it - * with the value 1 + * Method (copied from put) added for Jalview to efficiently increment a key's + * value if present, else add it with the given value. This avoids a double + * binary search (once to get the value, again to put the updated value). * * @param key + * @oparam toAdd */ - public void increment(int key) + public void add(int key, int toAdd) { int i = ContainerHelpers.binarySearch(mKeys, mSize, key); if (i >= 0) { - mValues[i]++; + mValues[i] += toAdd; } else { - put(key, 1); + i = ~i; + if (mSize >= mKeys.length) + { + int n = idealIntArraySize(mSize + 1); + int[] nkeys = new int[n]; + int[] nvalues = new int[n]; + // Log.e("SparseIntArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + mKeys = nkeys; + mValues = nvalues; + } + if (mSize - i != 0) + { + // Log.e("SparseIntArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + mKeys[i] = key; + mValues[i] = toAdd; + mSize++; } } } -- 1.7.10.2