2016-04-04 36 views
2

Bir HashMap'te anahtar ve değer girişini doldurmam gereken bir java kodu senaryom var. İstedim bujava Hashmap eşleme kimliğini yöntem adlarına eşleme

String zipweather = calculateZipWeather() 
mapObj.put(16,zipweather) 

gibi bir şey ben kullanmak gerekir anahtar kimliği önceden tanımlanmış olan ve karşılık gelen değeri bu

Key=16 value= *result of method calculateZipWeather()* 
Key=23 value= *result of method calculateZipCensus()* 
key=37 value = *result of method calulateZipCrime()* 

gibi ben bu bugün olduğu gibi bir şey işleme kod mantığı aracılığıyla üretmek olduğunu java kodundaki sabit kodlama anahtarı kimliğinden ziyade, anahtar kimliği ile bununla eşleşen yöntem adı arasında statik dış eşlemeyi sürdürmenin bir yolu olup olmadığını kontrol edin.

Düşüncelerinizi bana bildirin.

public class Operations { 

    public String calculateZipWeather() { 
     return "Zip Weather"; 
    } 

    public String calculateZipCensus() { 
     return "Zip Census"; 
    } 

    public String calculateZipCrime() { 
     return "Zip Crime"; 
    } 

} 

O zaman ne gerek bunu nasıl aşağıdaki (Yöntem: Tüm 'hesapla' yöntemlerini içeren sınıf aşağıdakilere sahip varsayalım

:

+2

Anahtar değerlerini yöntem adlarıyla eşleştirmek için yansıma kullanın (veya 'Yöntem' nesneleri). – Thomas

cevap

0

Bu Reflection kullanarak bunu yapabilirsiniz nasıl java.lang.reflect.Method):

public class Populate { 

    //This map contains mapping of your 'keys' with 'methods' which need to be invoked for those keys 
    private static Map<Integer, Method> keyOperationMapping; 

    //static initializer block to initialize the above map 
    static { 
     keyOperationMapping = new HashMap<Integer, Method>(); 

     try { 
      //Getting the 'Method' object with method name as 'calculateZipWeather' from 'Operations' class and mapping it with key 
      Method method16 = Operations.class.getDeclaredMethod("calculateZipWeather"); 
      keyOperationMapping.put(16, method16); 
     } 
     catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 

     try { 
      //Getting the 'Method' object with method name as 'calculateZipCensus' from 'Operations' class. 
      Method method23 = Operations.class.getDeclaredMethod("calculateZipCensus"); 
      keyOperationMapping.put(16, method23); 
     } 
     catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 

     //Similary add more key-value pairs 

    } 

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     //You need an Operations object on which the methods will be called/invoked 
     Operations operations = new Operations(); 

     //Map to store your results 
     Map<Integer, String> calculatedZips = new HashMap<Integer, String>(); 
     //Iterate over all key-value pairs of key with methods 
     for(Map.Entry<Integer, Method> entry : keyOperationMapping.entrySet()) { 
      //Get method to be invoked 
      Method methodToInvoke = entry.getValue(); 

      //Invoke the method on operations object, you can also pass arguments here if your method requires 
      String zipValue = (String) methodToInvoke.invoke(operations); 

      //Get key which will be your argum 
      int zipKey = entry.getKey(); 

      calculatedZips.put(zipKey, zipValue); 
     } 

    } 

}