2017-05-24 98 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到底!!! –

相关问题