0
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)并将数字(作为字符串)存储在数组列表中。问题是(1,2,333,4,5),例如,当我的 if 语句应该转到 else 并检查数字在到达逗号之前有多少位时。然后我把它的子字符串存储到我的数组列表中。问题是,由于某种原因,当我们到达 else 语句时,我的位置没有更新(我们必须增加比 for 循环的更多,因为数字不止一个位置。但是当我运行它时,我的程序打印出以下内容:

1
2
333
333
33
3
4
5

4

5 回答 5

7

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

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

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

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

于 2012-12-04T13:21:37.827 回答
2

由于您的问题已经被“skeeted”,我只有以下评论:

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

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\\dJava 中转义 '\')是数字的简写字符类。意思是“+上一个词一次或多次”。是贪心的+,所以它需要尽可能多的数字到一个匹配中。其余代码只是用于正则表达式匹配的 Java 语法。

于 2012-12-04T13:24:40.533 回答
2

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

PS为什么所有的复杂性而不仅仅是:

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

先去掉括号?

于 2012-12-04T13:19:37.400 回答
0

对于我的理解以及您想要如何做,您的代码中有一些错误。

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

您的第一个循环从 1 开始,而 String 的索引基于 0,这意味着您没有检查node. 该循环也会在i到达时结束node_location,但是,如果您想要括号中的所有数字node,它应该在到达结束时停止。所以node_location应该用 in 的索引来)初始化node。这是假设您只有 1 个右括号。

在您的第二个循环之前,您应该使用 i 初始化 update_1 ,否则您将在循环之后使用 1 + 在您的 else 中完成的循环数更新 i。

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

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

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

于 2012-12-04T14:22:06.717 回答
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);
   }
}
于 2012-12-04T13:22:17.103 回答