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