【问题标题】:Loop with undefined number of iterations迭代次数未定义的循环
【发布时间】:2012-05-01 21:35:36
【问题描述】:

我有一个逻辑问题。允许用户向表单添加任意数量的字段。提交表单后,我需要收集所有字段的值并将它们存储在 ArrayList 中。问题是我不知道表单中是否只有1个字段,还是500个。

我区分单个表单字段的方法是在它们的名称中添加索引号,因此在表单中会有 name="field1"、name="field2" 等字段。

这是我目前的代码:

for (int i = 1; i < number of fields; i++) {
    while (request.getParameter("field" + Integer.toString(i)) != null) {
        Add to ArrayList
    }
}

如何找到字段数?或者也许这个问题有其他解决方案?

【问题讨论】:

  • 您如何存储表单中的字段?当然,存储字段的对象必须知道有多少字段,或者至少知道如何遍历字段。
  • @Mankarse 没错,这对我来说似乎是一个设计缺陷

标签: java loops


【解决方案1】:

使用while循环:

int i=0;

while (request.getParameter("field" + Integer.toString(i)) != null) {

    // Add to ArrayList

    i++; // very important, don't forget this one
}

// i is the count of fields at this point

【讨论】:

    【解决方案2】:

    这应该没问题:

    i=1;
    
    while (request.getParameter("field" + Integer.toString(i)) != null) {
            //Add to ArrayList
            i++;
    }
    

    【讨论】:

      【解决方案3】:

      java中有3种循环。

      1. for 循环 - 当您确切知道需要迭代多少个条目时使用。
      2. while 循环 - 当你不知道有多少时使用,可能是 0 - 500
      3. do while - 当它必须运行至少一次并且之后的任意次数时使用。

      听起来你需要找出一种方法来检查一个字段是否存在,并根据他们是否能够输入 0 来构造一个 while 或 do while

      【讨论】:

      • for 循环不需要知道有多少条目。它只需要一个停止条件:for (int i = 0; request.getParameter("field" + i) != null; i++) {...}
      • 是的,您实际上可以这样做,但这是一个很好理解的 java 设计原则,而不是物理限制。这就是大多数课程/书籍将如何解释它,因为它更有意义,并提供了一个很好的用例示例来说明何时使用每一个。大多数论坛也会给出这个答案,例如:forums.devx.com/showthread.php?threadid=152488
      • 这根本不是一个很好理解的 Java 设计原则。 for 循环的第二部分是终止条件,如果存在,它必须是布尔值。顺便说一句,官方 Java 教程 (docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html) 并没有从许多元素的角度来解释它。 JLS 也没有 (docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14)
      • 这就是我在大学里被多个有着长期职业生涯的讲师所认为的方式,也是我们看过的 2 本书和 4 种通用编程省/实践中描述的方式。这只是他最简单的描述方式,因为大多数人刚开始时无法理解何时使用一个而不是另一个
      • 仅仅因为它易于理解并不能使它成为现实。在引入增强的 for 循环之前,大多数 for 循环看起来像这样:for (Iterator it = list.iterator(); it.hasNext(); ) {。这里绝对没有已知元素数量的概念。
      【解决方案4】:

      您可以使用 request.getParameterNames() 并循环浏览元素

      for(Enumeration e = request.getParameterNames();
       e.hasMoreElements(); ){
                      String parameterName = (String)e.nextElement();
                   //Your code logic with the parameter.
      
      }
      

      这是一个更有效的逻辑,因为您不需要先计算参数的数量,然后添加到ArrayList。而且你不需要玩null 和 NPE

      【讨论】:

        【解决方案5】:

        您的request 对象应该有一些有用的方法,例如getParameterNames 枚举Strings,或getParameterMap 这是不言自明的。这两者都可以用来围绕所有参数设置一个循环,无论它们的数量是多少。

        HTH

        【讨论】:

          【解决方案6】:
          Enumeration<String> parameterNames = request.getParameterNames();
          while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            if (parameterName.startsWith("field")) {
              Add request.getParameter(parameterName) to ArrayList
            }
          }
          

          【讨论】:

            【解决方案7】:

            您可以使用 getParameterValues() 获取所有值来执行此操作,您必须确保页面中的所有字段都应具有相同的名称。像这样

            <input type="text" name="field" id="field1"/>
            <input type="text" name="field" id="field2"/>
            <input type="text" name="field" id="field3"/>
            <input type="text" name="field" id="field4"/>
            

            在服务器端你可以这样写

            String[] arrFields  = request.getParameterValues("field");
            for(String field: arrField)
            {
                  // put the field into the arraylist.
            }
            

            【讨论】:

              猜你喜欢
              • 2013-12-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-06-01
              • 2014-11-26
              • 1970-01-01
              相关资源
              最近更新 更多