diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-09-10 10:58:09 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-09-10 10:58:09 +0200 |
commit | 440a39081e32ad634eb27ebfa5eb31b84f9c39e6 (patch) | |
tree | 15b28f3bc6e670a0b130e32174c7ed124cbe7d96 /document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java | |
parent | 79fbe75a324084d7e871e4aa7b82500e7ccd35b3 (diff) |
Before compareTo on a hashmap makes sense it must be sorted.
Diffstat (limited to 'document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java')
-rw-r--r-- | document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java index 6d6c18755c1..bf40546d637 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/MapFieldValue.java @@ -10,7 +10,16 @@ import com.yahoo.document.serialization.FieldReader; import com.yahoo.document.serialization.FieldWriter; import com.yahoo.document.serialization.XmlSerializationHelper; import com.yahoo.document.serialization.XmlStream; -import java.util.*; + +import java.util.Arrays; +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import java.util.List; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + /** * Vespa map. Backed by and and parametrized by FieldValue @@ -72,10 +81,7 @@ public class MapFieldValue<K extends FieldValue, V extends FieldValue> extends C */ public boolean equals(Object o) { if (!(o instanceof MapFieldValue)) return false; - MapFieldValue otherSet = (MapFieldValue) o; - Map<K, V> map1 = values; - Map<K, V> map2 = otherSet.values; - return (super.equals(o) && map1.equals(map2)); + return super.equals(o) && values.equals(((MapFieldValue) o).values); } @Override @@ -276,14 +282,24 @@ public class MapFieldValue<K extends FieldValue, V extends FieldValue> extends C return comp; } //types are equal, this must be of this type - MapFieldValue otherValue = (MapFieldValue) fieldValue; - comp = CollectionComparator.compare(values.keySet(), otherValue.values.keySet()); - - if (comp != 0) { - return comp; + MapFieldValue<K,V> rhs = (MapFieldValue<K,V>) fieldValue; + if (size() < rhs.size()) { + return -1; + } else if (size() > rhs.size()) { + return 1; + } + Map.Entry<K,V> [] entries = entrySet().toArray(new Map.Entry[size()]); + Map.Entry<K,V> [] rhsEntries = rhs.entrySet().toArray(new Map.Entry[rhs.size()]); + Arrays.sort(entries, (Map.Entry<K,V> a, Map.Entry<K,V> b) -> { return a.getKey().compareTo(b.getKey()); }); + Arrays.sort(rhsEntries, (Map.Entry<K,V> a, Map.Entry<K,V> b) -> { return a.getKey().compareTo(b.getKey()); }); + for (int i = 0; i < entries.length; i++) { + comp = entries[i].getKey().compareTo(rhsEntries[i].getKey()); + if (comp != 0) return comp; + comp = entries[i].getValue().compareTo(rhsEntries[i].getValue()); + if (comp != 0) return comp; } - return CollectionComparator.compare(values.values(), otherValue.values.values()); + return 0; } /** |