如何在没有List的情况下循环变量

时间:2017-05-24 17:51:49

标签: java android arrays variables methods

如何在不使用数百个 if 的情况下循环和修改变量?

我目前有以下代码:

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)

4 个答案:

答案 0 :(得分: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 :(得分: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
}

更新:如果需要,您可以将列表位置分配给变量:

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

答案 2 :(得分: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();
    }
}

答案 3 :(得分:-1)

您可以使用反射,代码生成或只将所有变量放在类中的列表中。在你的例子中,我会更喜欢最后。我的意思是同时创建单独的变量和thrm列表