2016-10-25 11 views
0

文字列に含まれているかっこ/区切り文字が平衡しているかどうかを確認する簡単なコードです。私は効率を改善するためにできることがたくさんあると確信していますが、現在のチュートリアルの目的のために、なぜこの形式ではうまくいかず、現在の問題は何かを知りたいと思います。文字列に含まれている角括弧と区切り文字が平衡しているかどうかを確認してください。

まず、変数cをLinkedListに追加することはできません。リテラル値を使用する必要があります。別のチュートリアルでも同じですが、変数を追加するだけです。

第2に、場合によっては、if文ごとにリンクされたリストにデリミタを追加しない場合があります。文字列 '(私が(もしあれば)区切り記号があれば)[文章]は[釣り合っている]と評価されますが、バランスの取れたものとして評価されますが、私のコードからしてはいけません。

最後に、私は同じエラーを持っていたが、散発的ではないすべての文字列 - 「kljf [] {} [] [] {csadlkfsd」

これがエラーを返し、いくつかの私は、例えば、ランダムに入力

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(Unknown Source) 
    at set07102.Delimiter.main(Delimiter.java:16) 

であり、16行目は 'char c = s.charAt(0);'そして、私が見る限り、これは起こってはならない。

System.out.println(strStack);リンクされたリストを調べることが最後にあるだけです - もしそれがコードをはるかに超えていれば!

どのようなヘルプamaaaaaaaaazingおかげでみんなされます。

import java.util.LinkedList; 
import java.util.Scanner; 

public class Delimiter { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner scanner = new Scanner(System.in); 
    System.out.println("Please enter a string containing different types of brackets: "); 
    String str = scanner.nextLine(); 
    String[] strSplit = str.split(" "); 
    LinkedList<Character> strStack = new LinkedList<>(); 
    System.out.println(" "); 
    for(String s : strSplit) { 
     char c = s.charAt(0); 
     if(c == '('){ 
      strStack.push('('); 
     } 
     if(c == '{'){ 
      strStack.push('{'); 
     } 
     if(c == '['){ 
      strStack.push('['); 
     } 
     if(c == '<'){ 
      strStack.push('<'); 
     } 
     if(c == ')' && strStack.get(0) != '('){ 
      System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!"); 
      break; 
     } 
     if(c == ']' && strStack.get(0) != '['){ 
      System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!"); 
      break; 
     } 
     if(c == '}' && strStack.get(0) != '{'){ 
      System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!"); 
      break; 
     } 
     if(c == '>' && strStack.get(0) != '<'){ 
      System.out.println("The delimiters in the string " + "'" + str + "'" + " are not balanced!"); 
      break; 
     } 
    } 
    System.out.println("The delimiters in the string " + "'" + str + "'" + " are balanced. "); 

    System.out.println(" "); 
    System.out.println(strStack); 
} 
} 
+0

右と左の区切り文字の数が同じであることを確認するためのコードはまだありませんが、既存の問題を見つけたら十分簡単に​​それを行うことができます。再度ありがとう –

+1

あなたは何のために分割をしたいですか?あなたは入力の言葉を反復していますが、代わりに文字を反復処理する必要がありますか? –

+0

'char c = s.charAt(0);行のStringIndexOutOfBoundsExceptionは、文字列にインデックス0がない、つまり文字列が空であることを意味します。 –

答えて

0

これを行う1つの方法があります。完全にバグがなく、すべてのケースを処理するかどうかはわかりませんが、近いかもしれないと思います。

他のユーザーがコメントしたように、入力文字列を分割するのは間違った方法です。各文字を繰り返し処理し、スタックを使用して、あなたが見たかっこと次に閉じなければならないものを追跡する必要があります。

import java.util.HashMap; 
import java.util.Scanner; 
import java.util.Stack; 

public class BalancedBrackets 
{ 

    public static void main(String[] args) 
    { 
     HashMap<Character,Character> bracketPairs = new HashMap<Character,Character>(); 
     bracketPairs.put('[', ']'); 
     bracketPairs.put('(', ')'); 
     bracketPairs.put('{', '}'); 
     bracketPairs.put('<', '>'); 

     Stack stack = new Stack();  
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Please enter a string containing different types of brackets: "); 
     String str = scanner.nextLine(); 

     for(int i = 0; i < str.length(); i++) 
     { 
      char c = str.charAt(i); 
      if(bracketPairs.keySet().contains(c)) 
      { 
       stack.push(c); 
      } 
      if(bracketPairs.values().contains(c)) 
      { 
       if(stack.size() == 0) 
       { 
        System.out.println("Unexpected closing bracket."); 
        return; 
       } 

       char lastOpen = (char) stack.peek(); 
       char expectedClose = bracketPairs.get(lastOpen); 
       if(expectedClose == c) 
       { 
        stack.pop(); 
       } 
       else 
       { 
        System.out.println("Unexpected closing bracket."); 
        return; 
       } 
      } 
     } 
     if(stack.size()==0) 
     { 
      System.out.println("String is balanced."); 
     } 
     else 
     { 
      System.out.println("String is unbalanced."); 
     } 
    } 
} 
+0

私は分裂する必要はありませんでしたなぜ私はそれがそこにあったのかわかりませんが、それは一つの理由だったと私はスタックからそれらを削除することは別だったと思います。それは今うまく動作している! –

関連する問題