diff options
Diffstat (limited to 'src/main/java/org/unitConverter/unit/UnitDatabase.java')
-rw-r--r-- | src/main/java/org/unitConverter/unit/UnitDatabase.java | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/main/java/org/unitConverter/unit/UnitDatabase.java b/src/main/java/org/unitConverter/unit/UnitDatabase.java index 6322fef..673f119 100644 --- a/src/main/java/org/unitConverter/unit/UnitDatabase.java +++ b/src/main/java/org/unitConverter/unit/UnitDatabase.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -1097,6 +1098,13 @@ public final class UnitDatabase { .compile("(\\S+)\\s+(\\S.*)"); /** + * Like normal string comparisons, but shorter strings are always less than + * longer strings. + */ + private static final Comparator<String> lengthFirstComparator = Comparator + .comparingInt(String::length).thenComparing(Comparator.naturalOrder()); + + /** * The exponent operator * * @param base base of exponentiation @@ -1150,6 +1158,22 @@ public final class UnitDatabase { } /** + * @return true if entry represents a removable duplicate entry of unitMap. + * @since 2021-05-22 + */ + private static boolean isRemovableDuplicate(Map<String, Unit> unitMap, + Entry<String, Unit> entry) { + for (final Entry<String, Unit> e : unitMap.entrySet()) { + final String name = e.getKey(); + final Unit value = e.getValue(); + if (lengthFirstComparator.compare(entry.getKey(), name) < 0 + && Objects.equals(unitMap.get(entry.getKey()), value)) + return true; + } + return false; + } + + /** * The units in this system, excluding prefixes. * * @since 2019-01-07 @@ -2015,11 +2039,20 @@ public final class UnitDatabase { } /** + * @param includeDuplicates if true, duplicate units will all exist in the + * map; if false, only one of each unit will exist, + * even if the names are different * @return a map mapping unit names to units, ignoring prefixes * @since 2019-04-13 * @since v0.2.0 */ - public Map<String, Unit> unitMapPrefixless() { - return Collections.unmodifiableMap(this.prefixlessUnits); + public Map<String, Unit> unitMapPrefixless(boolean includeDuplicates) { + if (includeDuplicates) + return Collections.unmodifiableMap(this.prefixlessUnits); + else + return Collections.unmodifiableMap(ConditionalExistenceCollections + .conditionalExistenceMap(this.prefixlessUnits, + entry -> !isRemovableDuplicate(this.prefixlessUnits, + entry))); } } |