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ステートメントに到達したときにIの場所が更新されないことです(数字が複数の場所であったため、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、インクリメントされることはなく、にi戻ります1

コードを完全に書き直すことを強くお勧めします。現時点では、コードが達成するには複雑すぎるように見えます。分割して,から、各文字列から数字以外の文字を削除することはできませんか?

于 2012-12-04T13:21:37.827 に答える
2

問題の1つは、ブランチupdate_iに入るたびに初期化するのではなく、上部でのみ初期化することだと思います。else

PSなぜすべての複雑さだけでなく:

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

最初に括弧を削除しましたか?

于 2012-12-04T13:19:37.400 に答える
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 ( \\dJavaでは「\」をエスケープするために)は数字の省略形の文字クラスです。+「前の用語を1回以上」という意味です。は+貪欲なので、1つの一致にできるだけ多くの数字が必要です。残りのコードは、正規表現マッチング用のJava構文です。

于 2012-12-04T13:24:40.533 に答える
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 に答える
0

私が理解していることと、それをどのように実行したいかについては、コードにいくつかの間違いがあります。

node_location正しく初期化されていない変数から始めて、提供したコードは最初のループが入力されていないことを確認します。

文字列のインデックスが0ベースである間、最初のループは1から始まります。つまり、の最初の文字をチェックしていませんnode。そのループもにi達するnode_locationと終了しますが、の括弧内のすべての数字が必要なnode場合は、閉じている数字に達すると停止する必要があります。したがって、 innode_locationのインデックスで初期化する必要があります。これは、閉じ括弧が1つしかないことを前提としています。)node

2番目のループの前に、update_1をiで初期化する必要があります。そうでない場合は、ループの後で、1+他で実行されたループの数でiを更新します。

2番目のループも正しくありません。あなたがしたいのは、昏睡状態または閉じ括弧に達するまでロップすることです。Jon Skeetが指摘したように、期待する文字列のループをコーディングした方法では、-1が返され、ループに入りません。

以前に取得したのと同じ複数の文字番号を使用したかどうかを確認するには、同じ条件が必要ですif (node.charAt(i + 1) == ',' || node.charAt(i + 1) == ')') {。数値を構成するすべての文字を収集するための変数(StringまたはStringBuilder)が必要です。これにより、すべての文字を取得したら、に追加できますnode_array。ifが一致しない場合、ループはに達したときにも終了する必要がありますnode_location

多くの人が言及しているように、あなたのニーズに対するより良い、より単純な解決策がありますが、私がここで提供したものはあなた自身のコードを改善するための良いスタートです。

于 2012-12-04T14:22:06.717 に答える