2015-10-05 98 views
2

我試圖使用Reflection從值中打印字段的名稱。然而,當沒有重複的字段時它就起作用。但在下面的情況下,假設我有重複值的字段,我把它們放在HashMap。在這種情況下,我得到不正確的字段名稱如何從一個具有多個相同值的字段中獲取值的字段名稱

我選擇HashMap存儲字段名稱,但可以有一個人請告訴我,如果有任何其他的方式來實現我想要做

public class TestBug { 

private static String banana = "green"; 
private static String apple = "red"; 
private static String blueberry = "blue"; 
private static String mango = "green"; 


private Map<String, String> fillFruitMap() { 
    Map<String, String> fruitMap = new HashMap<String, String>(); 
    String fruitColor = ""; 
    String fruitName = ""; 
    Field[] fields = TestBug.class.getDeclaredFields(); 
    for (int i = 0; i < fields.length; i++) { 
     try{ 
      fruitColor = fields[i].get(this).toString();  
      fruitName = fields[i].getName(); 
      fruitMap.put(fruitColor, fruitName); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    return fruitMap; 
} 

private String getFruitNameFromColor(String color) { 
    return fillFruitMap().get(color); 
} 

private void printStatement(String fruit) { 
    System.out.println("Green is the color of "+getFruitNameFromColor(fruit)); 
} 

public static void main(String[] args) { 
    TestBug bug = new TestBug(); 
    bug.printStatement(banana); 
} 

}

在上面的代碼由於我通過bananaprintStatement方法它應該也打印banana因爲我使用Reflection並將字段值和名稱存儲爲keyvalue對在HashMap。 但由於HashMap不允許重複key,banana被覆蓋mango。有沒有辦法實現我想要做的事情?

有沒有辦法可以使用hashCode()

+0

爲什麼你不能有水果名稱作爲關鍵 –

回答

4

一種選擇是使用Map<String, List<String>>,而不是Map<String, String>

private Map<String, List<String>> fillFruitMap() { 
    Map<String, List<String>> fruitMap = new HashMap<String, List<String>>(); 
    String fruitColor = ""; 
    String fruitName = ""; 
    Field[] fields = TestBug.class.getDeclaredFields(); 
    for (int i = 0; i < fields.length; i++) { 
     try{ 
      fruitColor = fields[i].get(this).toString();  
      fruitName = fields[i].getName(); 
      List<String> list = fruitMap.get(fruitColor); 
      if(list == null) list = new ArrayList<String>(); 
      list.add(fruitName); 
      fruitMap.put(fruitColor, list); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    return fruitMap; 
} 
+0

即使我有一個>如果我通過香蕉方法,我怎麼能得到香蕉?因爲我會重複列表,最後我怎麼知道我應該印刷香蕉而不是芒果? –

+0

這是您要回答的問題。你怎麼知道你想要哪種水果,因爲香蕉和芒果都有相同的顏色? –

+0

由於我通過了「香蕉」,它應該從「列表」中選擇「香蕉」。 –

2

與您的代碼的問題是,你選擇了一個錯誤的表示:由於價值與場不是一比一(你有注意到),但一到多,你的代碼應該返回Map<String,List<String>>而不是Map<String,String>

private Map<String,List<String>> fillFruitMap() { 
    Map<String, String> fruitMap = new HashMap<String,List<String>>(); 
    String fruitColor = ""; 
    String fruitName = ""; 
    Field[] fields = TestBug.class.getDeclaredFields(); 
    for (int i = 0; i < fields.length; i++) { 
     try{ 
      fruitColor = fields[i].get(this).toString();  
      fruitName = fields[i].getName(); 
      List<String> list = fruitMap.get(fruitColor); 
      if (list == null) { 
       list = new ArrayList<String>(); 
       fruitMap.put(fruitColor, list); 
      } 
      list.add(fruitName); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    return fruitMap; 
} 

這將讓您存儲與理想值的所有字段的名稱。當然,使用這個更新的fillFruitMap的代碼也應該改變。具體而言,它需要準備好在迭代地圖時打印列表,而不是單個字符串。

+0

即使我有一個>如果我通過'banana'方法,如何獲得'banana'?正如我正在迭代「List」,最後我怎麼知道我應該打印香蕉而不是芒果? –

+0

@ user1629109「因爲我通過了」香蕉「,所以應該選擇」香蕉「......」不,你沒有通過香蕉「',你通過了**值**變量**,但是,該值爲「綠色」。你的程序沒有辦法找出你所傳遞的變量的名字。 – dasblinkenlight

+0

是的。這是我面臨的問題。你知道是否有一種方法來存儲'hashCode'並比較hashCode並得到我想要做的? –

相關問題