For循环不会增加计数器

时间:2012-12-04 13:17:02

标签: java

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;
      }
    }
  }
}

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

  

1
  2
  333个
  333个
  33个
  3
  4
  5

5 个答案:

答案 0 :(得分:7)

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

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

鉴于您的原始字符串根本不包含"),"indexOf将返回-1,您将永远不会进入循环体。因此,update_i永远不会增加,您将i设置回1

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

答案 1 :(得分:2)

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

P.S。为什么所有的复杂性而不仅仅是:

String[] tok = node.split(",");

首先删除了括号?

答案 2 :(得分:2)

由于您的问题已经“受到抨击”,我只想说明以下内容:

在这个例子中,我认为你的正则表达式要好得多。以下是拆分示例字符串的代码:

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());
        }
    }
}

输出:

  

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

说明: \d(Java中的\\d以转义'\')是数字的速记字符类。 +表示“上一学期一次或多次”。 +是贪婪的,所以它需要尽可能多的数字到一个匹配。其余代码只是用于正则表达式匹配的Java语法。

答案 3 :(得分:0)

我认为您应该使用split类的String方法,因为它会更容易:

static void nodes(String node)
{

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

答案 4 :(得分:0)

根据我的理解和您希望的方式,您的代码中会出现一些错误。

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

你的第一个循环从1开始,而String的索引是0,这意味着你没有检查node的第一个字符。当i到达node_location时,该循环也会结束,但是,如果您想要node中括号之间的所有数字,它应该在到达结束时停止。因此node_location应使用)中的node索引进行初始化。假设您只有一个右括号。

在第二次循环之前,您应该使用i初始化update_1,或者在循环之后更新i,并使用1 +在您的其他位置完成的循环次数。

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

您应该具有相同的条件来检查您是否完成了if (node.charAt(i + 1) == ',' || node.charAt(i + 1) == ')') {之前的多个字符编号。您需要一个变量(String或StringBuilder)来收集构成您的号码的所有字符,这样您就可以将它们添加到node_array。如果if不匹配,那么该循环也应该结束,当它达到node_location时。

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