This task can also be tackled using an object-oriented approach, utilizing "Symbol" objects along with a "Conversion" object to handle them: public class Symbol { String name ; Map < Symbol , Double > conversionRates = new HashMap < > ( ) ; public Symbol ( String name ) { this . name = name ; } public addConversion ( Symbol symbol , double rate ) { conversionRates . put ( symbol , rate ) ; } } public class Conversion { Map < String , Symbol > symbols = new HashMap < > ( ) ; public addConversion ( String sym1 , String sym2 , double rate ) { if ( ! symbols . containsKey ( sym1 ) ) { symbols . put ( sym1 , new Symbol ( sym1 ) ) ; } if ( ! symbols . containsKey ( sym2 ) ) { symbols . put ( sym2 , new Symbol ( sym2 ) ) ; } symbols . get ( sym1 ) . addConversion ( symbols . get ( sym2 ) , rate ) ; } public double getConversion ( String sym1 , String sym2 ) { if ( ! symbols . containsKey ( sym1 ) || ! symbols . containsKey ( sym2 ) ) { return - 1 ; // or throw an exception } Symbol symbol1 = symbols . get ( sym1 ) ; Symbol symbol2 = symbols . get ( sym2 ) ; if ( symbol1 . conversionRates . containsKey ( symbol2 ) ) { return symbol1 . conversionRates . get ( symbol2 ) ; } if ( symbol2 . conversionRates . containsKey ( symbol1 ) ) { return 1 / symbol2 . conversionRates . get ( symbol1 ) ; } return - 1 ; // or throw an exception } } You can now easily add conversion rates using addConversion("USD", "EUR", 0.88) and retrieve conversion rates with getConversion("USD", "EUR") .