Как я могу реализовать стек строк с помощью оператора switch?

#java

#java

Вопрос:

Я хотел бы реализовать свой StringStack в операторе switch, как я могу заставить это работать на Java. это говорит о том, что я не могу нажать () и аргумент со значением символа. Каков наилучший способ обойти это для моего метода проверки?

 package xmlvalidator;

public class BasicXmlValidator implements XmlValidator {


    @Override
    public String[] validate(String xmlDocument) {
        // TODO Auto-generated method stub

        int charIndex = 0;
        char currentCharacter;
        String characterString;


        while (charIndex < xmlDocument.length()) {
            currentCharacter = xmlDocument.charAt(charIndex);
            characterString = Character.toString(currentCharacter);

            switch (currentCharacter) {
            case '(': StringStack.push(currentCharacter);
                break;
            case '[': StringStack.push(currentCharacter);
            break;
            case '{': StringStack.push(currentCharacter);
            break;
            case ')': StringStack.push(currentCharacter);
            break;
            case ']': StringStack.push(currentCharacter);
            break;
            case '}': StringStack.push(currentCharacter);
            break;

            }
        }


        return null;
    }

}




package xmlvalidator;

import static java.lang.System.*;

public class BasicStringStack implements StringStack {

    public int count; // Number of Items in the array

    public String[] stackItems; // The array that holds the stack items


    public BasicStringStack(int initialSize) {
        count = 0;
        stackItems = new String[initialSize];
    }


    @Override
    public void push(String item) {
        // TODO Auto-generated method stub

        if (count == stackItems.length) {
            int newLength = (stackItems.length   1);
            String[] tempArray = new String[newLength];
            arraycopy(stackItems, 0, tempArray, 0, stackItems.length);
            stackItems = tempArray;
        }

        stackItems[count  ] = item;


    }


    @Override
    public String pop() {

        if (count == 0) {
            return null;
        } else {
            return stackItems[--count];
        }


    }


    @Override
    public String peek(int position) {

        if ((position > count - 1) || (position < 0)) {
            return null; // outside Bounds
        } else {
            return stackItems[count - position - 1];
        }

    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return count;
    }

}
  

Комментарии:

1. ваша функция public String[] validate(String xmlDocument); возвращает null, но она должна возвращать массив строк, а ваш int charIndex = 0; не увеличивается, и у вас есть массив строк и ваш вводимый символ в нем

2. Я еще не закончил код. Я просто хочу знать, как указать значение моего символа.

3. используете ли вы StringStack из apache: [ссылка] commons.apache.org/proper/commons-collections/javadocs /…

4. @AdaLovelace если какой-либо из приведенных ниже ответов вам помог, рассмотрите возможность их голосования. Если кто-то ответил на ваш вопрос, вы можете пометить его как ответ зеленой галочкой.

Ответ №1:

У вас есть текущий символ, хранящийся в строке characterString = Character.toString(currentCharacter); , просто используйте его для вставки в стек.

 StringStack.push(currentCharacter);

change to

StringStack.push(currentString);
  

Комментарии:

1. это была моя логика, поэтому я создал символьную строку, но при этом я получаю ошибку компиляции, потому что она хочет, чтобы я изменил свой метод push() на статический метод, чего я не могу сделать, потому что у меня есть j-модульный тестер, который я должен передать. есть ли какой-либо другой вариант

2. Попробуйте изменить свой метод push, чтобы получить аргумент в качестве символа.

3. Я не могу, потому что это должен быть StringStack

Ответ №2:

Ваша проблема именно такова, как ее описывает Java. Вы char передаете a методу, который ожидает String . Лучшим решением было бы

 Stringstack.push(characterString);
  

Кроме того: поскольку switch позволяет вам провалиться, вы можете переписать его как

 switch (currentCharacter) {
   case '(':
   case '[': 
   case '{': 
   case ')':
   case ']': 
   case '}':
    StringStack.push(characterString);
    break;
}
  

Далее в сторону: я не рассматривал другие потенциальные проблемы в коде, а стремился только ответить на заданный вопрос.

Комментарии:

1. Stringstack.push(новая строка(текущий символ));

2. Я не понимаю этот код и то, куда он идет, это не исправляет

3. В коде уже есть characterString = Character.toString(currentCharacter); — просто нажмите это

4. StringStack.push(символьная строка);

5. я не могу этого сделать, потому что он хочет, чтобы я изменил свой push на static, что испортит мою программу hole, потому что я должен использовать j-модульный тестер, который не позволит