[英]For loop doesn't increase counter
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語句時,I的位置不會更新(我們必須比for循環增加更多,因為數字不只一個位。但是當我運行它時,我的程序打印出以下內容:
1個
2
333
333
33
3
4
5
不幸的是,很難同時理解您的代碼和問題-但這看起來很相關:
for(int a=i+2;a<=node.indexOf("),");a++)
假設您的原始字符串根本不包含"),"
, indexOf
將返回-1,並且您將永遠不會進入循環體。 因此, update_i
將永遠不會增加,並且您將i
設置為1
。
我強烈建議您完全重寫您的代碼-目前看來,對於實現的代碼來說,它太復雜了。 您不能拆分,
然后從每個字符串中刪除所有非數字字符嗎?
我認為問題之一是您只在頂部初始化update_i
,而不是每次進入else
分支時都進行初始化。
PS為什么是所有復雜性,而不僅僅是:
String[] tok = node.split(",");
首先刪除括號?
由於您的問題已經被“質疑”,我僅作以下說明:
我認為在此示例中,使用正則表達式會更好。 這是拆分示例字符串的代碼:
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語法。
我認為您應該使用String
類的split
方法,因為它將更容易:
static void nodes(String node)
{
ArrayList<String> node_array = new ArrayList<String>();
String allValues[] = node.split(",");
for(String value : allValues){
node_array.add(value);
}
}
就我所了解的以及您想如何做而言,您的代碼中存在一些錯誤。
node_location
正確初始化的node_location
變量開始,提供的代碼可確保甚至沒有輸入第一個循環。
您的第一個循環從1開始,而String的索引基於0,這意味着您不檢查node
的第一個字符。 當i
到達node_location
,該循環也結束了,但是,如果您想在node
括號之間加上所有數字,則在到達閉合數字時應該停止。 因此,應使用node
的索引)
初始化node_location
。 假設您只有1個右括號。
在第二個循環之前,您應該使用i初始化update_1,否則在循環之后,用1 +在else中完成的循環次數來更新i。
您的第二個循環也不正確。 您要做的就是lo住,直到達到昏迷或右括號為止。 正如Jon Skeet所指出的那樣,您為期望的String編寫循環的方式將返回-1並且不會進入循環。
您應該具有與如果if (node.charAt(i + 1) == ',' || node.charAt(i + 1) == ')') {
。 您將需要一個變量(String或StringBuilder)來收集構成數字的所有字符,以便在擁有所有node_array
其添加到node_array
。 如果if不匹配,則該循環也應在到達node_location
時node_location
。
正如許多人提到的那樣,有一種更好,更簡單的解決方案可以滿足您的需求,但是我在這里提供的是改進您自己的代碼的良好開端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.