Переводчик предложений Java Pig Latin с использованием очередей

Я очень новичок в Java и пытаюсь создать программу для перевода предложения на Pig Latin, перемещая первую букву слова в конец и добавляя «y» в конце, если первая буква была гласной и «ау» в конце иначе. Я должен использовать очередь для этого. В настоящее время моя программа просто завершается, и мне было интересно, сможет ли кто-нибудь определить, где я ошибаюсь или куда двигаться дальше. Спасибо!

импортировать MyQueue.QueueList; импортировать java.util.Scanner;

открытый класс PigLatin {

public static void main (String[] args)
 {


    Scanner scan = new Scanner (System.in);

    QueueList word = new QueueList();

    String message;
    int index = 0;
    char firstch;
    System.out.print ("Enter an English sentence: ");
    message = scan.nextLine();
    System.out.println ("The equivalent Pig Latin sentence is: ");

    firstch = Character.toLowerCase(message.charAt(0));


            if (firstch != 'a' && firstch != 'e' && firstch != 'i' && firstch != 'o' && firstch != 'u' 
                    && firstch != ' ')
                {
                    for (index = 1; index < message.length(); index++)

                        {
                            word.enqueue(new Character(message.charAt(index)));
                        }

                    word.enqueue(new Character (firstch));
                    word.enqueue(new Character ('a'));
                    word.enqueue(new Character ('y'));
                    word.enqueue(new Character(' '));

                }

            else if (firstch == 'a' || firstch == 'e' || firstch == 'i' || firstch == 'o' || firstch == 'u')
            {
                while (message.charAt(index) != ' ')
                {
                for (index = 1; index < message.length(); index++)
                        {   
                            word.enqueue(new Character(message.charAt(index)));
                        }
                }
                word.enqueue((firstch));
                word.enqueue( ('y'));
                word.enqueue((' '));
            }
            else if (message.charAt(index) == ' ')
            {
                index++;
                firstch = message.charAt(index);
            }



    while (!word.empty())
        System.out.print(word.dequeue());

}

}

А вот и класс QueueList из пакета MyQueue:

// QueueList.java
//
// Class QueueList definition with composed List object.    

package MyQueue;

public class QueueList {

    private List a_queue;

    public QueueList() {
        a_queue = new List( "queue" );
    }

    public Object peek() throws EmptyListException {
        if (a_queue.isEmpty())
            return null;
        else
            return a_queue.getFirstObject();
    }

    public void print() {
        a_queue.print();
    }

    public void enqueue(Object object) {
        a_queue.insertAtBack(object);
    }

    public Object dequeue() throws EmptyListException {
        return a_queue.removeFromFront();
    }

    public boolean empty() {
        return a_queue.isEmpty();
    }

}

person user2659030    schedule 07.08.2013    source источник
comment
Не могли бы вы запустить средство форматирования для вашего кода? Немного сложно отследить ваши условные операторы.   -  person chrylis -cautiouslyoptimistic-    schedule 07.08.2013
comment
Исправлены отступы. Отступ ctrl-k не очень хорошо работает с вкладками, извиняюсь за то, что испортил первое редактирование.   -  person Jason C    schedule 07.08.2013
comment
Спасибо за помощь в отступах. Я отредактировал его до последней версии моей программы, которая в настоящее время не будет переводить, а вместо этого распечатывать именно то, что было напечатано.   -  person user2659030    schedule 07.08.2013
comment
Я обновил ответ ниже.   -  person Jason C    schedule 07.08.2013


Ответы (1)


Вы не сбрасываете индекс до 0 перед входом во второй цикл while. Так как index == message.length() после завершения первого цикла, второй цикл завершается немедленно.

Редактировать: Re: Ваше последнее обновление.

Во втором цикле вы удаляете только первые символы message.length() из очереди слов. Если вы добавили -ay в конец, вы его не увидите. Вместо этого зацикливайте длину очереди, а не длину входного сообщения:

while (!word.empty())
    System.out.print(word.dequeue());

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

person Jason C    schedule 07.08.2013
comment
Я исправил это (большое спасибо, что заметили) и загрузил отредактированную версию, но моя программа печатает только введенное мной предложение с первой буквой предложения в конце. Какие-либо предложения? - person user2659030; 07.08.2013
comment
Спасибо, Джейсон. Я не совсем уверен, как обрабатывать отдельные слова, но посмотрю на это. - person user2659030; 07.08.2013
comment
У меня есть вопрос о моих циклах for. Являются ли они неправильными, потому что я не должен устанавливать index = 1 для обработки отдельных слов? - person user2659030; 07.08.2013
comment
Кроме того, причина, по которой у меня был цикл while вокруг всего этого в начале, заключалась в том, что я думал обработать отдельные слова, но это неправильно? - person user2659030; 07.08.2013
comment
Что бы я сделал, так это написал метод, который меняет одно слово на Pig-Latin. Возьмите свое входное предложение и проверьте String.split(). Поэкспериментируйте с ним. Вы можете использовать это, чтобы разделить предложение на массив слов. Преобразуйте каждое слово, а затем соедините их вместе, чтобы составить предложение. Причина, по которой вы используете 1, кстати, заключается в том, чтобы пропустить первую букву - мне это кажется разумным. Запишите свой алгоритм на листе бумаги, проработайте шаги, а затем переведите его на Java. - person Jason C; 07.08.2013