2017-05-10 3 views
0

コンソールに何かを入力したとします((8+8))。次に、角かっこの挿入が正しいかどうかをプログラムが知らせます。我々は正しいブラケットを持っている他のブラケットの挿入が正しい(算術)かどうかを言うJavaのコードをゆっくりとしようとしています

() this means if one array element is (and next) 
)( 
if the amount of "(" is not equal to amount of ")" 

:ここ

間違っブラケットの私の(もちろん、完成していない)の定義です。

私のコードはコンソール入力を文字列配列要素に分割します。私はこれらと一緒に働きます。問題は私が例のように(8)を持っているとき私が出力Trueを得るステートメントを書くことができないことです。ここで

は私のコードです:

import java.util.Scanner; 
    public class Brackets{ 
    public static void main(String[] args){ 
     Scanner input = new Scanner(System.in); 
     String any = input.nextLine(); 
     String sArray[] = any.split(""); 
     int counter1=0; 
     int counter2=0; 


     for(int i=0; i<sArray.length-1; i++){ 
      if(sArray[i].equals("(")){ 
       counter1++; 
      } 
      if(sArray[i].equals(")")){ 
       counter2++; 
      } 
      if(sArray[i].equals("(") && sArray[i+1].equals(")")){ 
       System.out.println("False"); 
       return; 
      } 
      if(sArray[i].equals(")") && sArray[i+1].equals("(")){ 
       System.out.println("False"); 
       return; 
      } 
     } 
     if(counter1 == counter2){ 
      System.out.println("True"); 
     } 
     if(counter1 != counter2){ 
      System.out.println("False"); 
     } 
    } 
} 

私はこの

if(sArray[i].equals("(") && sArray[i+1].equals(")")){ 
       System.out.println("False"); 
       return; 
      } 

に問題があると思います。しかし、私は、私は、このような(など2つの近傍の配列要素を探していた場合、その方法を修正することができます)

+0

'(8 +)8'は何を返しますか – Ishnark

+1

@Ishnarkだから私は「ゆっくり」と「もちろん終了していません」という言葉を使用しています。まず私の質問に対する答えを探しています。私は自分自身で残りの部分を続けることができました。 – cnmesr

+0

_ this_に問題があると思われますが、正確にはどういう意味ですか? –

答えて

3

これらのチェックは間違っており、冗長です。

 if(sArray[i].equals("(") && sArray[i+1].equals(")")){ 
      System.out.println("False"); 
      return; 
     } 
     if(sArray[i].equals(")") && sArray[i+1].equals("(")){ 
      System.out.println("False"); 
      return; 
     } 

また、多くのことを単純化することもできます。たとえば、カウンタは1つだけです。

int counter = 0; 
    for(int i=0; i<sArray.length-1; i++){ 
     if(sArray[i].equals("(")){ 
      counter++; 
     } 
     if(sArray[i].equals(")")){ 
      counter--; 
     } 
     if (counter<0) { 
      System.out.println("Close bracket with no open bracket found"); 
     } 
    } 

    if (counter > 0) { 
     System.out.println("An open bracket was never closed"); 
    } 

これにはいくつかの改善点があります。後でオープンがあっても、それは

  • を見つけたもので

    1. 意味のメッセージが開いせずに閉じ括弧を検出します。たとえば、「)を渡す(」「(失敗だろうが)」。
    2. のみ使用しています1カウンタ変数

    最後の変更である文体本当に。あなたはまだ二つのカウンタでこれを行うと、2番目のものを比較することができ

    もう1つ改善すると、文字列を分割する必要はありません。else ifは、それができないことがわかっているので、より効率的になります。 a ')'が 'a'だった場合は '('。

    int counter = 0; 
        for(int i=0; i<any.length()-1; i++) { 
         if(any.charAt(i) == '(') { 
          counter++; 
         } else if(any.charAt(i) == ')')) { 
          counter--; 
         } 
         if (counter<0) { 
          System.out.println("Close bracket with no open bracket found"); 
         } 
        } 
    
        if (counter > 0) { 
         System.out.println("An open bracket was never closed"); 
        } 
    

    すべての文字列分割などを行う必要がないため、これははるかに効率的です。すべてのメソッド名はメモリにありますので、微調整が必​​要な場合があります。

  • 2

    開かれたスコープの数をカウントするには、1つのカウンタが必要です。そして、それがどんなところでも負になるなら、失敗します。最後にゼロであれば、合格、そうでなければ失敗。

    関連する問題