如何在不使用数百个 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)
答案 0 :(得分:2)
您似乎不想使用ArrayList
,因为您希望按名称访问每个变量,例如getOne
或getHundred
。在这种情况下,您应该使用 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列表