Problem
The United States uses the imperial system of weights and measures, which means that there are many different, seemingly arbitrary units to measure distance. There are 12 inches in a foot, 3 feet in a yard, 22 yards in a chain, and so on.
Create a data structure that can efficiently convert a certain quantity of one unit to the correct amount of any other unit. You should also allow for additional units to be added to the system.
Solution
To solve this problem, we can create a data structure that captures the relationships between different units and allows efficient conversion between them.
Method 1 - Using Hashmap
This class will store conversion factors between different units in a map and provide methods to convert between units and add new units.
- We use a
HashMap
to store conversion factors from different units to a base unit (inches in this case). - The key in the map is the unit name (e.g., “inch”, “foot”), and the value is the conversion factor to inches.
Code
Java
public class ImperialUnitConverter {
// Map to store conversion factors for each unit to a base unit (e.g., inches).
private Map < String,
Double > conversionFactors;
public ImperialUnitConverter() {
conversionFactors = new HashMap<>();
// Initialize with some known conversions
addUnit("inch", 1.0);
addUnit("foot", 12.0); // 1 foot = 12 inches
addUnit("yard", 36.0); // 1 yard = 3 feet = 36 inches
addUnit("chain", 792.0); // 1 chain = 22 yards = 792 inches
}
public void addUnit(String unit, double factorToInch) {
conversionFactors.put(unit, factorToInch);
}
public double convert(double quantity, String fromUnit, String toUnit) {
if (!conversionFactors.containsKey(fromUnit) || !conversionFactors.containsKey(toUnit)) {
throw new IllegalArgumentException("Unknown unit: " + fromUnit + " or " + toUnit);
}
double factorFrom = conversionFactors.get(fromUnit);
double factorTo = conversionFactors.get(toUnit);
// Convert the quantity to the base unit (inches) first, then to the target unit
double quantityInInches = quantity * factorFrom;
return quantityInInches / factorTo;
}
public static void main(String[] args) {
ImperialUnitConverter converter = new ImperialUnitConverter();
// Examples of conversion
double feetToYards = converter.convert(6, "foot", "yard"); // 6 feet to yards
System.out.println("6 feet is " + feetToYards + " yards");
double yardsToChains = converter.convert(44, "yard", "chain"); // 44 yards to chains
System.out.println("44 yards is " + yardsToChains + " chains");
// Adding a new unit and converting
converter.addUnit("mile", 63360.0); // 1 mile = 63360 inches
double milesToInches = converter.convert(1, "mile", "inch"); // 1 mile to inches
System.out.println("1 mile is " + milesToInches + " inches");
double chainsToMiles = converter.convert(88, "chain", "mile"); // 88 chains to miles
System.out.println("88 chains is " + chainsToMiles + " miles");
}
}