Что я делаю не так с моим кодом? Перевод в PigLatin и не могу понять, как напечатать возвращаемое значение - PullRequest
0 голосов
/ 20 марта 2020
import java.util.*;
public class Project3 {
    public static void main (String[] args) {

    ArrayList<String> translationOfPigLatin = new ArrayList<String>();
    Scanner Scanner = new Scanner(System.in);
    translationOfPigLatin.add(Scanner.next());
    StringBuffer sb = new StringBuffer();
      for(int i = 0; i < pigLatin.length; i++) {
        System.out.println(pigLatin[i]);

      } 
    }
    public static String translateToPigLatin(String pigLatin){
    int num = 0;
    String translationToPigLatin = pigLatin;

    if (pigLatin.indexOf('a') == num){
        System.out.print(pigLatin + "ay");
            return pigLatin;
       } else if (pigLatin.indexOf('e') == num){
        System.out.println(pigLatin + "ay");
            return pigLatin;
       } else if (pigLatin.indexOf('i') == num){
       System.out.println(pigLatin + "ay");
            return pigLatin;
       } else if (pigLatin.indexOf('o') == num){
        System.out.println(pigLatin + "ay");
            return pigLatin;
       } else if (pigLatin.indexOf('u') == num){
        System.out.println(pigLatin + "ay");
            return pigLatin;
       } else {
        char firstLetter = pigLatin.charAt(0); 
        pigLatin = pigLatin.substring(1); 
        System.out.println(pigLatin + firstLetter + "ay");
            return pigLatin; 
        }
    }
}

Я не знаю, как вернуть значение pigLatin, чтобы можно было его распечатать. Инструкции для моего кода были следующими: Ваша программа должна принимать предложение (любой длины) в качестве аргументов командной строки. Ваша программа должна содержать метод с именем translateToPigLatin (), который принимает в качестве аргумента массив Strings (входные данные) и возвращает одну String (перевод Pig Latin). Каждое слово в предложении должно быть переведено на Pig Latin с использованием приведенных выше правил. Вы должны напечатать перевод Pig Latin в предложении обратно на одной строке. Вы можете игнорировать знаки препинания и заглавные буквы и предполагать, что все вводимые данные теста будут состоять только из строчных букв и пробелов.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Давайте сделаем это шаг за шагом. Давайте на минутку забудем обо всем остальном и сосредоточимся на функции translateToPigLatin.

Нам нужно создать функцию, которая принимает String и выводит другую, которая будет ее эквивалентом Pig Latin. Ты чуть не прибил это. Вот такая функция с парой настроек вашего исходного кода:

    // Let's write a function that takes an input string and outputs pigLatin translation
    public static String translateToPigLatin(String pigLatin) {
        int num = 0;
        // This translationToPigLatin variable ONLY EXISTS between the start and end {} of this function.
        // You are not really using it inside this function, so let's forget about it.
        // String translationToPigLatin = pigLatin;

        // Instead of writing output now. Let the function just do the transform and we'll do output later on.
        // I've commented out all the System.out.print
        if (pigLatin.indexOf('a') == num) {
            //System.out.print(pigLatin + "ay");

            // Whenever we do a return statement, we need to put the value that we want the function to return.
            // In your code, you called System.out.print with the appropriate value but returned just the pigLatin
            // variable which would contain the original word. We need to return the translated value instead. 
            return pigLatin + "ay";
        } else if (pigLatin.indexOf('e') == num) {
            //System.out.println(pigLatin + "ay");
            return pigLatin + "ay";
        } else if (pigLatin.indexOf('i') == num) {
            //System.out.println(pigLatin + "ay");
            return pigLatin + "ay";
        } else if (pigLatin.indexOf('o') == num) {
            //System.out.println(pigLatin + "ay");
            return pigLatin + "ay";
        } else if (pigLatin.indexOf('u') == num) {
            //System.out.println(pigLatin + "ay");
            return pigLatin + "ay";
        } else {
            char firstLetter = pigLatin.charAt(0);
            pigLatin = pigLatin.substring(1);
            //System.out.println(pigLatin + firstLetter + "ay");
            return pigLatin + firstLetter + "ay";
        }
    }

Я не знаю, нужен ли вам этот перевод, потому что вы забыли включить правила, но это будет рабочая версия Ваша функция перевода.

Теперь давайте немного проясним это.

Сначала имя входной переменной. Давайте просто назовем это input, чтобы мы знали, что он стоит за все время.

    public static String translateToPigLatin(String input) {

Мы можем избавиться от int num = 0. Если вам нужно проверить начало слова, было бы более практичным сделать что-то вроде этого:

        // Create a variable that holds the first character
        char firstLetter = input.charAt(0);

Теперь, поскольку у вас есть 5 случаев, в которых ваш if будет делать то же самое, давайте напишем единственное условие для всех них.

        // In Java || is the logical OR operator. This condition will be true if the first predicate is true OR
        // the second OR the third...
        // In other words. If any of these comparisons are true. The condition will be true.
        if (firstLetter == 'a' || firstLetter == 'e' || firstLetter == 'i' || firstLetter == 'o' || firstLetter == 'u') {
            // And then we'll do this.
            return input + "ay";
        }

Поскольку у нас уже есть первая буква, мы можем написать else, например:

        else {
            // A variable with all but the first letter
            String noFirstLetter = input.substring(1);
            // And return the piglatin translation
            return noFirstLetter + firstLetter + "ay";
        }

Соединение всего этого выглядит следующим образом :

    public static String translateToPigLatin(String input) {
        char firstLetter = input.charAt(0);

        if (firstLetter == 'a' || firstLetter == 'e' || firstLetter == 'i' || firstLetter == 'o' || firstLetter == 'u') {
            return input + "ay";
        } else {
            String noFirstLetter = input.substring(1);
            return noFirstLetter + firstLetter + "ay";
        }
    }

Единственное, что делает, это каким-то образом преобразует информацию, содержащуюся в input и return результат этого преобразования. Теперь, когда у нас есть это, давайте забудем все о том, как это работает, и посмотрим на это как на черный ящик. Мы просто будем знать, что если вы сделаете String output = translateToPigLatin("something"), мы получим omethingsay в качестве результата.

Это способ, которым мы могли бы использовать это, чтобы описать то, что описывает ваше упражнение.

    public static void main(String[] args) {
        // We need to process the console input. The way you originally used is indeed a good way to do that.
        // Notice the lowercase scanner. In Java, by convention, variables are named starting lowercase.
        Scanner scanner = new Scanner(System.in);

        // Every scanner.next call we'll return an input word. Knowing that we just need to accumulate those.
        // A List seems appropriate for that task.
        List<String> list = new ArrayList<>();

        // As we don't know how many input strings we are receiving we'll just have to rely on scanner's hasNext method
        // to known when we are done. When there's nothing more to read, hasNext will return false, ending our loop.
        while(scanner.hasNext()) {
            String word = scanner.next();
            // We'll immediately translate every received word using our translation function
            String translation = translateToPigLatin(word);
            // Then store the translation and repeat
            list.add(translation);
        }

        // When we reach the end of the words we then proceed to write them in the console in one line, separated by
        // spaces. We can use String.join to generate a big String containing every word on list, separated by spaces.
        String result = String.join(" ", list);
        // And print it out
        System.out.println(result);
    }

После написания последовательности вручную вам нужно использовать Ctrl + D, если в Linux или Ctrl + Z, а затем в Windows, чтобы сообщить программе, что вы закончили. Я надеюсь, что это было полезно. Если это решит вашу проблему, не забудьте пометить мой ответ как решение, чтобы оно могло помочь большему количеству людей в будущем.

0 голосов
/ 20 марта 2020

Прежде всего вам нужно знать, что нельзя использовать зарезервированные слова в качестве имен переменных. Итак, сначала измените код следующим образом:

Scanner scanner = new Scanner(System.in);// not as Scanner Scanner.

, а затем в основной функции у вас нет переменной с именем pigLatin и, следовательно, у вас не будет к ней доступа. И, как я понимаю, ваш вопрос должен иметь массив строк в качестве параметра в методе translateToPigLatin . Для возврата массива pigLatin вы можете сохранить pigLatin каждой строки в переменную, собрать их в переменную массива и вернуть эту переменную массива.

...