Java For循环不增加计数器

Java For循环不增加计数器,java,Java,此方法假定采用1,2,3,4,5格式的字符串,并将数字作为字符串存储在arraylist中。问题是当我有1,2333,4,5时,例如我的if语句应该转到else,并在到达逗号之前检查数字的位置。然后我取它的子字符串并将其存储到我的arraylist中。问题是,由于某种原因,当我们到达else语句时,I的位置不会更新,因为数字不止一个,所以我们必须比for循环对I的增量更大。但是,当我运行它时,我的程序会打印出以下内容: 一, 2. 333 333 33 3. 4. 五, 我认为其中一个问题是您只

此方法假定采用1,2,3,4,5格式的字符串,并将数字作为字符串存储在arraylist中。问题是当我有1,2333,4,5时,例如我的if语句应该转到else,并在到达逗号之前检查数字的位置。然后我取它的子字符串并将其存储到我的arraylist中。问题是,由于某种原因,当我们到达else语句时,I的位置不会更新,因为数字不止一个,所以我们必须比for循环对I的增量更大。但是,当我运行它时,我的程序会打印出以下内容:

一, 2. 333 333 33 3. 4. 五,


我认为其中一个问题是您只在顶部初始化update_I,而不是每次进入else分支时都这样做

附言:为什么这么复杂,而不仅仅是:

static void nodes(String node) {
  int node_location;
  int i;
  int update_i=1;
  node_location=((node.indexOf("(("))-2);
  ArrayList<String> node_array = new ArrayList<String>();

  for( i=1;i<node_location;i++) {
    if(node.charAt(i)!=',') {
      if(node.charAt(i+1)==',' || node.charAt(i+1)==')')
        node_array.add(Character.toString(node.charAt(i)));
      else {
        for(int a=i+2;a<=node.indexOf("),");a++) {
          update_i++;
          if(node.charAt(a)==',') {
            node_array.add(node.substring(i, a));
            break;
          }
        }
        i=update_i;
      }
    }
  }
}

先去掉括号?

不幸的是,您的代码和问题都很难理解,但这看起来很相关:

String[] tok = node.split(",");
假设您的原始字符串根本不包含,indexOf将返回-1,您将永远不会进入循环体。因此,update_i将永远不会递增,您将i设置回1

我强烈建议你完全重写你的代码——目前它看起来太复杂了。您不能在上拆分,然后从每个字符串中删除任何非数字字符吗?

我认为您应该使用字符串类的拆分方法,因为这样会更容易:

for(int a=i+2;a<=node.indexOf("),");a++)

由于你的问题已经被提出,我只想说:

我认为在这个例子中,使用正则表达式会更好。下面是拆分示例字符串的代码:

static void nodes(String node)
{

   ArrayList<String> node_array = new ArrayList<String>();
   String allValues[] = node.split(",");
   for(String value : allValues){
      node_array.add(value);
   }
}
输出:

发现:3 发现:4 发现:555 发现:6 发现:4


解释:\d\\d在Java中转义“\”是数字的速记字符类。+表示上一术语一次或多次。+是贪婪的,因此它在一个匹配中使用尽可能多的数字。剩下的代码只是用于正则表达式匹配的Java语法。

就我的理解和您的操作方式而言,您的代码中有一些错误

从没有正确初始化的node_location变量开始,您提供的代码确保没有输入第一个循环

第一个循环从1开始,而字符串的索引是基于0的,这意味着您没有检查节点的第一个字符。当我到达node_位置时,循环也会结束,但是,如果您想要节点中括号之间的所有数字,当到达结束位置时,循环应该停止。因此,应该使用节点中的索引初始化节点位置。这是假设您只有一个右括号

在第二个循环之前,应该用i初始化update_1,或者在循环之后用1+在else中完成的循环数来更新i

您的第二个循环也不正确。你要做的是lopp,直到你昏迷或进入闭合括号。正如Jon Skeet指出的那样,按照您为期望的字符串编码循环的方式,它将返回-1,并且不会进入循环

如果node.charAti+1==”,“| | node.charAti+1==”,则应使用与之前相同的条件来检查是否已完成多个字符的编号{。您需要一个字符串或StringBuilder变量来收集构成数字的所有字符,以便在获得所有字符后将其添加到节点_数组中。如果if不匹配,则循环也应在到达节点_位置时结束


正如许多人提到的,有更好、更简单的解决方案可以满足您的需求,但我在这里提供的是改进您自己代码的良好开端。

这不是OP所期望的。@BhavikAmbani我认为让OP意识到另一种方法很好,但我们必须改进用户应用的代码,而不是流程的另一种方法。但我仍然想知道如何按照我的方式来做,谢谢大家的帮助。那么node.indexOf在开始时对于他的输入总是-1呢?@Esailija更进一步,即使有正确的索引a,-2也会确保第一个循环不会被输入。他的变量update_i被正确地初始化,但他做了其他操作我也会使用String的函数,但这并不能帮助他理解他的错误和代码的错误。
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String str = "(3,4,555,6,4)";

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()) {
            System.out.println("found: " + matcher.group());
        }
    }
}