diff --git a/pdb-utils/src/main/java/org/lucares/utils/MiniMap.java b/pdb-utils/src/main/java/org/lucares/utils/MiniMap.java index ea99955..9778b25 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/MiniMap.java +++ b/pdb-utils/src/main/java/org/lucares/utils/MiniMap.java @@ -15,18 +15,16 @@ public class MiniMap { private static final Object[] EMPTY_ARRAY = new Object[0]; private static final MiniMap EMPTY_MAP = new MiniMap<>(); - private Object[] keys; - private Object[] values; + // keys are on even indices (0,2,4,...) and values on uneven (1,3,5,...) + private Object[] keysValues; public MiniMap() { - keys = EMPTY_ARRAY; - values = EMPTY_ARRAY; + keysValues = EMPTY_ARRAY; } public MiniMap(final MiniMap miniMap){ - keys = miniMap.keys.clone(); - values = miniMap.values.clone(); + keysValues = miniMap.keysValues.clone(); } @SuppressWarnings("unchecked") @@ -35,7 +33,7 @@ public class MiniMap { } public int size() { - return keys.length; + return keysValues.length / 2; } public boolean isEmpty() { @@ -49,10 +47,11 @@ public class MiniMap { @SuppressWarnings("unchecked") public V get(Object key) { - for (int i = 0; i < keys.length; i++) { - Object object = keys[i]; + final int size = size(); + for (int i = 0; i < size; i++) { + Object object = keysValues[2*i]; if (Objects.equals(key, object)) { - return (V) values[i]; + return (V) keysValues[2*i+1]; } } return null; @@ -63,25 +62,23 @@ public class MiniMap { V oldValue = get(key); if (oldValue != null) { - for (int i = 0; i < keys.length; i++) { - Object object = keys[i]; + final int size = size(); + for (int i = 0; i < size; i++) { + Object object = keysValues[2*i]; if (Objects.equals(key, object)) { - values[i] = value; + keysValues[2*i+1] = value; break; } } } else { - final Object[] newKeys = new Object[keys.length + 1]; - System.arraycopy(keys, 0, newKeys, 0, keys.length); + final Object[] newKeysValues = new Object[keysValues.length + 2]; + System.arraycopy(keysValues, 0, newKeysValues, 0, keysValues.length); - final Object[] newValues = new Object[values.length + 1]; - System.arraycopy(values, 0, newValues, 0, values.length); - newKeys[newKeys.length - 1] = key; - newValues[newValues.length - 1] = value; + newKeysValues[newKeysValues.length - 2] = key; + newKeysValues[newKeysValues.length - 1] = value; - keys = newKeys; - values = newValues; + keysValues = newKeysValues; } return oldValue; @@ -94,26 +91,28 @@ public class MiniMap { } public void clear() { - keys = EMPTY_ARRAY; - values = EMPTY_ARRAY; + keysValues = EMPTY_ARRAY; } @SuppressWarnings("unchecked") public Set keySet() { - final Set result = new HashSet<>(keys.length); + final Set result = new HashSet<>(size()); - for (Object k : keys) { - result.add((K) k); + final int size = size(); + for (int i = 0; i < size; i++) { + K k = (K) keysValues[2*i]; + result.add(k); } return result; } @SuppressWarnings("unchecked") public Set values() { - final Set result = new HashSet<>(values.length); - - for (Object v : values) { - result.add((V) v); + final Set result = new HashSet<>(size()); + final int size = size(); + for (int i = 0; i < size; i++) { + V v = (V) keysValues[2*i+1]; + result.add(v); } return result; } @@ -122,8 +121,7 @@ public class MiniMap { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + Arrays.hashCode(keys); - result = prime * result + Arrays.hashCode(values); + result = prime * result + Arrays.hashCode(keysValues); return result; } @@ -137,9 +135,7 @@ public class MiniMap { if (getClass() != obj.getClass()) return false; MiniMap other = (MiniMap) obj; - if (!Arrays.equals(keys, other.keys)) - return false; - if (!Arrays.equals(values, other.values)) + if (!Arrays.equals(keysValues, other.keysValues)) return false; return true; }