2013-05-03 2 views
0

отредактировалПочему это «другое» заявление не работает?

Вот и вся программа. Я завернул символ в оболочке символов для использования .equals() и исправил проблему с индексом и заменил константы на литералы. Программа компилируется и работает нормально, говорит вам, если символы совпадают, но все же проскакивает, что «еще» заявление, когда есть непревзойденный символ:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 
import java.util.Stack; 


public class Exercise22_11 { 

/** 
* 
*/ 
public static void main(String[] args) { 

     /**for command line argument*/ 

     if(args.length == 0) { 
      System.out.println("You didn't enter an argument dummy!"); 
      System.exit(0); 
     } 


     String fileString = ""; 

     /**Open the file and read it*/ 

     try{  
      File myOutFile = new File(args[0]); 
      Scanner input = new Scanner(myOutFile); 
      while (input.hasNext()){ 
     fileString += input.next(); 
      } 

     }//try 

     catch (FileNotFoundException e){ 
     System.out.println("Sorry that file is not found " + e); 
     }//catch 

     /**Build the list of characters from file*/ 

     char[] charArray = new char[fileString.length()]; 

     for (int i = 0; i < fileString.length(); i++) { 
      charArray[i] = fileString.charAt(i); 
     }//for building charArray 

     /**Create a stack to manipulate grouping symbols*/ 

     Stack<Character> stack = new Stack<Character>(); 

     /**Pushes grouping symbols into stack and pops them when they correspond*/ 

     for (int i = 0; i < charArray.length; i++) { 
      Character temp = new Character(charArray[i]); 

      if (temp.equals('{') || temp.equals('(') || temp.equals('[')) { 
       stack.push(temp); 
      } else if (temp.equals('}') || temp.equals(')') || temp.equals(']')) { 
       if (temp.equals('}') && stack.peek().equals('{')){ 
        stack.pop(); 
       } else if (temp.equals(')') && stack.peek().equals('(')) { 
        stack.pop(); 
       } else if (temp.equals(']') && stack.peek().equals('[')) { 
        stack.pop(); 
       } else { 
        System.out.println("There is a mistake at index: " + i); 
        System.out.println("\nHere's the code (the error is in the middle):\n"); 
        for(int j = i - 20; j <= i + 20; j++) { 
         System.out.print(charArray[j]); 
        } 
        System.out.println("\n"); 
       } 
      } 

     }//for 

     /**Inform user of result*/ 

     if (stack.isEmpty()) { 
      System.out.println("Congratulations! Your grouping symbols are matched!"); 
     } 
     else { 
      System.out.println("I'm sorry. Please fix your program."); 
     } 



}//main 



}//class 

Окончательное «еще» заявление пропускаются во время выполнения, когда является ошибкой.

Задача заключалась в том, чтобы написать программу, используя список или коллекцию, которая проверяет, перекрываются ли символы группировки в программе. Файл должен быть введен как аргумент командной строки.

Вот что я спросил профессора (нет ответа еще нет):

  1. Почему я не могу создать сканер для чтения каждого символа из .txt (или .java файл)? Я попытался использовать разделитель «" (без пробела), чтобы избежать RIDICULOUS String для Char [] для манипулирования с помощью стека().

  2. Что такое инструкция friggin 'else?

Спасибо!

+12

Константы 'ONE',' TWO' и т. Д. Являются всего лишь запутанными вещами. Утверждение 'temp == SIX && stack.peek(). Equals (FIVE)' абсолютно не имеет смысла. 'temp == ']' && stack.peek(). equals ('[')' будет намного легче читать. Если вы назвали константы логически, то есть «OPEN_SQUARE_BRACKET» и «CLOSE_SQUARE_BRACKET», это было бы читаемо, но не более, чем литералы и литералы короче. –

+1

Вы не хотите печатать _index_, т. Е. 'I'? –

+1

Почему вы иногда используете '==', а иногда 'Object.equals'? –

ответ

0

Если этот оператор печати предназначен для отладки, то его нельзя размещать внутри else. Вы хотите, чтобы ваша ошибка проходила внутри одного из них, если нужно было зафиксировать (или выскочить), , а затем распечатать где ошибка была найдена. Избавьтесь от этого утверждения else. Сделать это

} else if (temp == SIX && stack.peek().equals(FIVE)) { 
        stack.pop(); 
       } 
    System.out.println("There is a mistake at index: " + charArray[i]); //it will work now 
+1

Он записывает сообщение об ошибке для всех элементов, даже если нет ошибки. – 2013-05-03 06:00:57

+0

Как выполнить else, если else-if (на том же уровне) уже выполнен? – Gannicus

+1

System.out.println («Ошибка указателя:» + charArray [i]); не находится в другом выражении в вашем ответе. Он будет выполнен после заявлений. – 2013-05-03 06:08:37

Смежные вопросы