【问题标题】:Java for and if loop code optimisationJava for 和 if 循环代码优化
【发布时间】:2016-02-03 18:31:03
【问题描述】:

我有一个ArrayList<String>,我需要遍历它,列表中的内容必须执行某些操作。我想优化迭代和比较,可以吗?

我的代码:

Person 类(包括getterssetters):

private String employeeID;

private String firstName;

private String lastName;

private String gender;

private String mobileNo;

private String emailID;

我计算出的ArrayListmyList- [firstName, gender, mobileNo, emailID]。如何优化如下所示的逻辑以避免出现如此多的if 条件?

Person p =new Person ();
for(String element:myList)
        {
       if("employeeid".equalsIgnoreCase(element))
            {
                p.setemployeeID("");
            }
       if("firstname".equalsIgnoreCase(element))
            {
                p.setfirstName("");
            }
       if("lastName".equalsIgnoreCase(element))
            {
                p.setlastName("");
            }
       if("gender".equalsIgnoreCase(element))
            {
                p.setgender("");
            }
       if("mobileno".equalsIgnoreCase(element))
            {
                p.setMobileNo("");
            }
       if("emailid".equalsIgnoreCase(element))
            {
                p.setEmailID("");
            }
        }

【问题讨论】:

  • 首先,你可以使用 if - else if,而不是 eacht time an if。您也可以打开它们。
  • 真的要使用列表吗?无法看到其背后的逻辑。
  • 解释一下你在做什么是值得的。优化循环似乎没有什么价值,因为它可能会被更好的方法取代。

标签: java if-statement for-loop optimization arraylist


【解决方案1】:

编译器能够将 switch 语句优化为查找表,并在处理枚举时对文字执行编译时检查。 话虽如此,您应该始终使用 switch 语句进行 3 次以上的比较。因此你的代码变成了-

private static final String EMPLOYEE_ID = "employeeid";
private static final String FIRST_NAME = "firstname";
private static final String LAST_NAME = "lastName";
private static final String GENDER = "gender";
private static final String MOBILE_NO = "mobileno";
private static final String EMAIL_ID = "emailid";

Person p =new Person ();
for(String element: myList) {
switch (element.toLowerCase()) {
  case EMPLOYEE_ID: p.setemployeeID("");
    break;
  case FIRST_NAME: p.setfirstName("");
    break;
  case LAST_NAME: p.setlastName("");
    break;
  case GENDER: p.setgender("");
    break;
  case MOBILE_NO: p.setMobileNo("");
    break;
  case EMAIL_ID: p.setEmailID("");
    break;
}

}

【讨论】:

  • 感谢您提供愉快的方式。
  • 感谢您的恢复:)。
  • 这甚至不是一个 ENUM。
  • 我从来没有说过,我们只能在 switch 语句中使用枚举。我们也可以使用最终变量,因为它们不会改变分配给它们的值。 java 编译器会自动将这些变量替换为您在答案中使用的相应常量值。
  • 无论如何我在答案中添加了一个适当的枚举作为参考
【解决方案2】:

这里没有太多要做,但也许switch 可以更美观。虽然您必须确保您的输入是仅小写仅大写

for(String element:myList) {
    switch (element.toLowerCase()){
        case "employeeid": p.setemployeeID(""); break;
        case "firstname" : p.setfirstname(""); break;
        .
        .
        .

    }
}

如果您决定要保留 if 设计,则绝对应该使用 if-else,这样您就不必在每次迭代中遍历 all ifs。

最后一点,这可能不是设计您想要做的任何事情的最佳方式。您应该考虑一些更面向对象的性质,例如在实例化 Person 对象时将 Person 对象的参数传递给构造函数。

编辑:我看到你想使用Enum,你会想像这样实际定义它:

public enum MyEnum {
    EMPLOYEE_ID("employeeid"),
    FIRST_NAME("firstname")
    .
    .
    .
    ;

    private final String text;

    private MyEnum(final String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return text;
    }
}

【讨论】:

  • 我认为您没有在代码中的任何地方使用 MyEnum。
  • 我之后将其添加为编辑。请参阅修订版。所以它很难证明反对票是合理的,但可以肯定
【解决方案3】:

我没有测试,但是(如果字符串和方法名称相同)您可以使用反射,如下所示:

Person p = new Person();
for(String element : myList) {

    // method params
    Class[] paramTypes = new Class[1];
    paramTypes[0] = String.class;

    // method
    String methodName = "set" + element.indexOf(0,1).toUpperCase() + element.indexOf(1);
    Method m = c.getDeclaredMethod(methodName, paramTypes);

    // call method
    m.invoke(p, "");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2014-03-05
    • 2016-02-23
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2019-05-31
    相关资源
    最近更新 更多