0

以下は、一致する括弧をチェックして、それらが適切にネストされているかどうかを確認するコードです。iとても単純に思えますが、ネストされた一致が見つかったときに が 0 にリセットされない理由がわかりません。どんなガイダンスでも大歓迎です。

    String testString = "{}()[] ";
    char [] openParenthesis = {'(','{','['};
    char [] closeParenthesis = {')','}',']'};

    ArrayList<Character> characterList = new ArrayList<Character>();
    for(char c : testString.toCharArray())
    {
        characterList.add(c);
        System.out.println("This is what is added to the list Arraylist: " + c);
    }

    System.out.println();


for(int i = 0; i < characterList.size()-1; i++)
            {
                System.out.println("1st Loop: " +characterList.get(i));
                System.out.println("1st Loop: " + characterList.get(i + 1));
                System.out.println("1st Loop: " + i);
                System.out.println();

                for(int j = 0; j < openParenthesis.length; j++)
                {
                    if (characterList.get(i) == openParenthesis[j])
                    {
                        if(characterList.get(i + 1) == closeParenthesis[j])
                        {
                            System.out.println("Nested Match");
                            System.out.println(characterList.get(i));
                            System.out.println(characterList.get(i + 1));
                            System.out.println();
                            characterList.remove(i);
                            characterList.remove(i + 1);
                            i = 0;
                        }
                    }   
                }
        }
4

6 に答える 6

2

まず、ArrayList の間違った場所を削除しています。

これは ArrayList であるため、characterList.remove(i);すべてを左の 1 つの場所に移動するため、次の likeは必要なcharacterList.remove(i+1);場所の右側にあるものを削除します。

また、openParenthesis ループにブレークを追加して、一致が見つかった場合に配列の先頭から検索を開始できるようにする必要もあります。

for ループの次の反復を開始する前に、 to を 1 にインクリメントするため、 i = 0toも変更する必要があります。i = -1

最後に、ArrayList はではなくオブジェクトを返すため、.equals()代わりにを使用する必要があります。==Characterchar

これが私が思いついたものです:

for (int i = 0; i < characterList.size() - 1; i++) {
        System.out.println("1st Loop: " + characterList.get(i));
        System.out.println("1st Loop: " + characterList.get(i + 1));
        System.out.println("1st Loop: " + i);
        System.out.println();

        for (int j = 0; j < openParenthesis.length; j++) {
            if (characterList.get(i).equals(openParenthesis[j])) {
                if (characterList.get(i + 1).equals(closeParenthesis[j])) {
                    System.out.println("Nested Match");
                    System.out.println(characterList.get(i));
                    System.out.println(characterList.get(i + 1));
                    System.out.println();
                    characterList.remove(i);
                    characterList.remove(i);
                    i = -1;
                    break;
                }
            }
        }
    }

このコードは上記のすべてのエラーを修正しており、正しく実行されるはずです。

于 2013-07-17T17:12:37.313 に答える
1

for ループiは、ループの本体が完了した後に 1 ずつインクリメントされます。

したがって、 を設定i=0し、ループの本体を終了し、i++が呼び出され、 でもう一度ループ本体に入りますi ==1

于 2013-07-17T17:13:29.133 に答える
1

まあそれはあなたが何であるかに依存しますtestString。私は値でそれをテストしfoo()、ループはif(characterList.get(i + 1) == closeParenthesis[j])条件内に入りました。

ただし、コードには次のような問題があります。

characterList.remove(i);
characterList.remove(i + 1);

要素を削除した後java.lang.IndexOutOfBoundsExceptioni+1場所が無効 (範囲外) になったため、次のようになります。ithそれは逆であるべきです:

characterList.remove(i + 1);
characterList.remove(i);

また、次のi=0;ように設定する必要はありません。i = -1;

さらに重要なのは、break を呼び出して内部 for ループから抜け出すことです。

したがって、コードは最終的に次のようになります。

i = -1;
break;

実際のデモを見る: http://ideone.com/DfGJ2m

于 2013-07-17T17:08:16.770 に答える
1

for明らかにループ内の i++ が にi等しいため1です。本当にもう一度設定0したい場合。i使用しi=-1ます。

于 2013-07-17T17:09:11.017 に答える
1

スタック データ構造を使用し、 http://www.geeksforgeeks.org/check-for-balanced-parentheses-in-an-expression/と同様のプロセスを使用できたと思います。

于 2013-07-17T17:16:10.633 に答える
0

文字をリストに格納すると、Java はそれを文字に自動ボックス化します。== 演算子を使用して 2 つの文字が等しいかどうかを比較することはできませんが、次のコードが示すように、.equals() メソッドを使用する必要があります。

  Character aOne = new Character('a');
  Character aTwo = new Character('a');

  if(aOne == aTwo)
  {
     System.out.println("aOne and aTwo == operator says they are equal");
  }
  else
  {
     System.out.println("aOne and aTwo == operator says they are NOT equal");
  }

  if(aOne.equals(aTwo))
  {
     System.out.println("aOne and aTwo .equals operator says they are equal");
  }

コードが出力されます:

aOne and aTwo == operator says they are NOT equal
aOne and aTwo .equals operator says they are equal
于 2013-07-17T17:12:23.670 に答える