summaryrefslogtreecommitdiff
path: root/src/main/java/org/unitConverter/unit/UnitDatabase.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/unitConverter/unit/UnitDatabase.java')
-rw-r--r--src/main/java/org/unitConverter/unit/UnitDatabase.java37
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)));
}
}