2012-08-29 57 views
0

想,我有一些變量:比較Java變量和打印

String x="abcd"; 
String y="qwert"; 
String z="mnvji"; 

更多...

我從用戶的輸入。 如果用戶輸入「x」,我打印該字符串,即我打印「abcd」 如果用戶輸入'y',則打印「qwert」等等...... 有沒有辦法在沒有開關或ifs的情況下執行此操作? ?

謝謝,朋友提前。

+0

這些變量屬性的一個或一個方法內的變量?如果他們是屬性,你可以使用反射(即使不推薦)。否則,你只是不能(見[這個問題](http://stackoverflow.com/q/744226/1225328))。在這種情況下,你應該考慮@dacwe的回答。 – sp00m

回答

0
Map<String, String> map = new HashMap<>(); 
map.put("x", "abcd"); 
map.put("y", "qwert"); 
map.put("z", "mnvji"); 
Scanner s = new Scanner(System.in); 
while (s.hasNextLine()) 
System.out.println(map.get(s.nextLine())); 

可能會工作。

7

您可以創建從輸入字符串到結果的映射。初始化地圖:

Map<String, String> map = new HashMap<String, String>(); 
map.put("x", "abcd"); 
map.put("y", "qwert"); 
map.put("z", "mnvji"); 

而當你想從用戶輸入打印結果:

Scanner s = new Scanner(System.in); 

while (s.hasNextLine()) 
    System.out.println(map.get(s.nextLine())); 
0

把你的變量設置成一個HashMap的(鍵,值)對,只是檢索用戶輸入密鑰時特定密鑰的值。

4

本地變量名稱在運行時不可用並且讀取字段知道它的名稱需要一些反映(請參閱@amit's answer)。你需要一張地圖:

Map<String, String> map = new HashMap<>(); 
map.put("x", "abcd"); 
map.put("y", "qwert"); 
map.put("z", "mnvji"); 

現在只是把價值從地圖:

String value = map.get(userInput); 

valuenull如果它不符合任何x/y/z

+0

我不喜歡第一種說法。反射API使用起來非常簡單。我同意它不被建議*,但通過字段名稱獲取價值相當容易。 (我添加了一個2行示例作爲回答,以顯示如何完成) – amit

+1

@amit:好吧,我不會在「* normal *」Java程序中使用反射,可能是在庫或框架中。但那不是重點。 OP說「*一些變量*」,我也在談論(本地)變量,而不是字段。 –

+0

*本地*變量是一個不同的故事,您應該在您的答案IMO中明確說明*。 – amit

1

使用鍵值對實現的地圖集合解決您的問題。

將變量x,y,z作爲關鍵字並將「abcd」,..作爲值。

根據輸入值從特定鍵值中檢索值。

Map<String, String> map = new HashMap<String, String>(); 
map.put("x", "abcd"); 
map.put("y", "qwert"); 
map.put("z", "mnvji"); 

獲得值

字符串值=地圖獲得(inputValue的)。

0

創建一個字符串數組,其中X,Y,Z應當是索引和存儲內容相對...

獲取用戶輸入,並將其傳遞到陣列作爲索引..你將得到它..

0

如果你沒有選擇,只能使用對象變量(領域),而不是其他的答案提出了Map爲 - 您可能需要使用reflection,並專門Class.getField()Class.getDeclaredField()方法 -

Field f = MyClass.class.getDeclaredField("x"); 
System.out.println(f.get(myObject)); 

其中MyClass是您的班級名稱,myObject是您希望從中獲得值的對象。

請注意,使用此方法 - 您無法添加字段 - 只能獲取現有字段。

0

如果你真的不想使用開關或ifs(我假設你包含地圖),那麼你將不得不使用反射來獲取所有變量的名稱,並決定打印哪些他們。這裏的基本知識:

Class yourClass = Class.forName("yourpackagename.YourClassName") 
Field[] allFields = yourClass.getDeclaredFields(); 
String[] fieldNames = new String[allFields.length]; 
for(int i = 0; i < fieldNames.length; i++) 
{ 
    fieldNames[i] = allFields [i].getName(); 
} 

//Get name of field user wants to display, and look it up in 
//the fieldNames array to get the index of it, store this index 

Object instance = yourClass.newInstance(); 
System.out.println(allFields[indexToDisplay].get(instance)); 

當然,這可能是矯枉過正。

2

正如我們一樣,也接近,

String input[]=new String['z']; 
input['X']="abcd"; 
input['Y']="qwert"; 
input['Z']="mnvji"; 
System.out.println(input['X']); 

但它會在一定的侷限性

+0

+1;簡單。但範圍檢查必須執行,但我想這就是你的意思*限制*。你可以很容易地做'input ['x'] = input ['X'] =「abcd」;'將相同的數據放入多個槽中。 – maba