From 40f7b6e806140fc2fc741c63c71f5ce97b4bd1d2 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 18 Apr 2022 17:41:43 -0500 Subject: Implemented one-way conversion, duplicate prefixes can now be hidden --- .../sevenUnits/converterGUI/SevenUnitsGUI.java | 5 +++-- src/main/java/sevenUnits/unit/BritishImperial.java | 2 +- src/main/java/sevenUnits/unit/UnitDatabase.java | 26 +++++++++++++--------- src/main/java/sevenUnits/unit/UnitType.java | 24 ++++++++++++++++++++ 4 files changed, 44 insertions(+), 13 deletions(-) (limited to 'src/main/java/sevenUnits') diff --git a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java index e10bab4..309bdb9 100644 --- a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java +++ b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java @@ -298,7 +298,8 @@ final class SevenUnitsGUI { this.database.unitMapPrefixless(true).keySet()); this.unitNames.sort(null); // sorts it using Comparable - this.prefixNames = new ArrayList<>(this.database.prefixMap().keySet()); + this.prefixNames = new ArrayList<>( + this.database.prefixMap(true).keySet()); this.prefixNames.sort(this.prefixNameComparator); // sorts it using my // comparator @@ -611,7 +612,7 @@ final class SevenUnitsGUI { * @since v0.2.0 */ public final Set prefixNameSet() { - return this.database.prefixMap().keySet(); + return this.database.prefixMap(true).keySet(); } /** diff --git a/src/main/java/sevenUnits/unit/BritishImperial.java b/src/main/java/sevenUnits/unit/BritishImperial.java index c6e65fb..0ecba6d 100644 --- a/src/main/java/sevenUnits/unit/BritishImperial.java +++ b/src/main/java/sevenUnits/unit/BritishImperial.java @@ -121,5 +121,5 @@ public final class BritishImperial { public static final Unit FAHRENHEIT = Unit .fromConversionFunctions(Metric.KELVIN.getBase(), tempK -> tempK * 1.8 - 459.67, tempF -> (tempF + 459.67) / 1.8) - .withName(NameSymbol.of("degrees Fahrenheit", "\u00B0F")); + .withName(NameSymbol.of("degree Fahrenheit", "\u00B0F")); } diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java index a4f0c44..71676a1 100644 --- a/src/main/java/sevenUnits/unit/UnitDatabase.java +++ b/src/main/java/sevenUnits/unit/UnitDatabase.java @@ -1160,16 +1160,16 @@ public final class UnitDatabase { } /** - * @return true if entry represents a removable duplicate entry of unitMap. + * @return true if entry represents a removable duplicate entry of map. * @since 2021-05-22 */ - static boolean isRemovableDuplicate(Map unitMap, - Entry entry) { - for (final Entry e : unitMap.entrySet()) { + static boolean isRemovableDuplicate(Map map, + Entry entry) { + for (final Entry e : map.entrySet()) { final String name = e.getKey(); - final Unit value = e.getValue(); + final T value = e.getValue(); if (lengthFirstComparator.compare(entry.getKey(), name) < 0 - && Objects.equals(unitMap.get(entry.getKey()), value)) + && Objects.equals(map.get(entry.getKey()), value)) return true; } return false; @@ -2010,12 +2010,18 @@ public final class UnitDatabase { } /** + * @param includeDuplicates if false, duplicates are removed from the map * @return a map mapping prefix names to prefixes - * @since 2019-04-13 - * @since v0.2.0 + * @since 2022-04-18 + * @since v0.4.0 */ - public Map prefixMap() { - return Collections.unmodifiableMap(this.prefixes); + public Map prefixMap(boolean includeDuplicates) { + if (includeDuplicates) + return Collections.unmodifiableMap(this.prefixes); + else + return Collections.unmodifiableMap(ConditionalExistenceCollections + .conditionalExistenceMap(this.prefixes, + entry -> !isRemovableDuplicate(this.prefixes, entry))); } /** diff --git a/src/main/java/sevenUnits/unit/UnitType.java b/src/main/java/sevenUnits/unit/UnitType.java index a13051a..7cebf2d 100644 --- a/src/main/java/sevenUnits/unit/UnitType.java +++ b/src/main/java/sevenUnits/unit/UnitType.java @@ -16,6 +16,8 @@ */ package sevenUnits.unit; +import java.util.function.Predicate; + /** * A type of unit, as chosen by the type of system it is in. *
    @@ -31,4 +33,26 @@ package sevenUnits.unit; */ public enum UnitType { METRIC, SEMI_METRIC, NON_METRIC; + + /** + * Determines which type a unit is. The type will be: + *
      + *
    • {@code SEMI_METRIC} if the unit passes the provided predicate + *
    • {@code METRIC} if it fails the predicate but is metric + *
    • {@code NON_METRIC} if it fails the predicate and is not metric + *
    + * + * @param u unit to test + * @param isSemiMetric predicate to determine if a unit is semi-metric + * @return type of unit + * @since 2022-04-18 + */ + public static final UnitType getType(Unit u, Predicate isSemiMetric) { + if (isSemiMetric.test(u)) + return SEMI_METRIC; + else if (u.isMetric()) + return METRIC; + else + return NON_METRIC; + } } -- cgit v1.2.3