簡體   English   中英

For循環不會增加計數器

[英]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_locationnode_location

正如許多人提到的那樣,有一種更好,更簡單的解決方案可以滿足您的需求,但是我在這里提供的是改進您自己的代碼的良好開端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM