2017-05-24 137 views
0

如何循環和修改變量而不使用數百個如果 s?如何在沒有列表的情況下循環變量

目前,我有以下代碼:

private int one = 5; 
private int ten = 9; 
private int hundred = 2; 
private int thousand = 8; 

public void checkBalance() { 
    if (one > 1) { 
     one *= 0.5; 
    } 
    if (ten > 1) { 
     ten *= 0.5; 
    } 
    if (hundred > 1) { 
     hundred *= 0.5; 
    } 
    if (thousand > 1) { 
     thousand *= 0.5; 
    } 
} 

我卻想了一些辦法,通過這些變量循環,然後針對所有那些同樣的事情。我不喜歡使用ArrayLists和類似的東西,因爲我需要它易於訪問和可讀(例如我稱爲getOne,getHundred)

+0

隨着你的設置,你不能。把它們放在某種數組/列表中。 – litelite

+0

我不能,因爲我也需要每個變量,這就是問題 – Jason

+0

然後你堅持'if'。 – litelite

回答

0

位後試驗和錯誤,我終於得到了我正在尋找的答案!

特別感謝@John Bollinger指引我在正確的方向!

private String moneyValues = {"one", "ten", "hundred", "thousand"} 

public void calculateBalance() {   
    for (int i = 0; i < moneyValues.length; i++) { 
     if (getMoneyValue(moneyValues[i]) > 1) { 
      setMoneyValue(moneyValues[i], getMoneyValue(moneyValues[i] * 0.5)); 
      break; 
     } 
    } 

private int getMoneyValue(String variableName) { 
    try { 
     Class<?> c = getClass(); 
     return Integer.parseInt(c.getDeclaredField(variableName).get(this).toString()); 
    } catch (IllegalAccessException | NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
    return 0; 
} 

private void setMoneyValue(String variableName, int value) { 
    try { 
     Class<?> c = getClass(); 
     c.getDeclaredField(variableName).set(this, value); 
    } catch (IllegalAccessException | NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
} 
-1

您可以使用反射,代碼生成或只是將所有變量放在一個在你班上的名單。在你的例子中,我會最後選擇。我的意思是創建單獨的變量,並在同一時間THRM列表

+0

反思和代碼生成過於複雜並且難以維護想法。 –

+0

這就是爲什麼我說「在你的例子中,我會更喜歡最後。」 –

0

我覺得這是最好的方法:

private int[] numbers = {5, 9, 2, 8}; 

public void checkBalance() { 
    for (int i = 0; i < numbers.length; i++) { 
     if (numbers[i] > 1) { 
      numbers[i] *= 0.5; 
     } 
    } 
} 

,你可以得到任何價值是這樣的:

System.out.println(numbers[0]); // This will print 5 
System.out.println(numbers[1]); // This will print 9 

或者你可以得到所有的值和全部打印出來:

for(int n : numbers){ 
    System.out.println(n); // This will print 5 9 2 8 
} 

UPDATE:您可以指定列表中的位置變量,如果你想:

private int one = numbers[0]; 
private int ten = numbers[1]; 
private int hundred = numbers[2]; 
private int thousand = numbers[3]; 
+0

因爲我需要多次更新它,將列表位置分配給變量不會更新變量。 – Jason

2

看來你不想使用ArrayList,因爲你要通過它的名字,例如訪問每個變量getOnegetHundred。在這種情況下,您應該使用HashMap,它解決了迭代數百個變量以及變量可訪問性的循環問題。

下面是你的問題的例子。

HashMap<String, Integer> data = new HashMap<>(); 
data.put("one", 5); 
data.put("ten", 9); 
data.put("hundred", 2); 
data.put("thousand", 8); 

這能解決你的問題,循環...

ArrayList<String> keys = new ArrayList<>(data.keySet()); //Get list of all keys 
for (int i = 0; i < keys.size(); i++) {  //iterate through keys 
    if (data.get(keys.get(i)) > 1) { 
     double temp = data.get(keys.get(i)); 
     data.put(keys.get(i), (int)temp * 0.5); //replace the original value 
    } 
} 

這解決了你的變量訪問性問題......

System.out.println(data.get("one")); 
System.out.println(data.get("ten")); 
+1

很確定當您檢查餘額(下至每個單元中的一個單元)時,OP有意收取一半的資金。我認爲我的老銀行糟糕。 –

+0

@ElliottFrisch到底!!! –

相關問題