【问题标题】:How do I get this return statement to work properly?如何让这个 return 语句正常工作?
【发布时间】:2020-07-09 11:13:18
【问题描述】:

该程序旨在导入文本文件并导出文本文件和猪拉丁语翻译。输入是一个单行文本文件,内容为“这是一个黑暗和暴风雨的夜晚”,输出需要如下所示:

It     ITWAY
was    ASWAY
a      AWAY
dark   ARKDAY
and    ANDWAY
stormy ORMYSTAY
night  IGHTNAY 

我只得到英文单词,而不是猪拉丁词。当我初始化 pigLatin 时,它会打印初始化的内容,但我无法获得返回值来实际更新变量。请帮忙!

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

public class PigLatinTranslator {

    public static void main(String[] args) throws FileNotFoundException {
        File textFile = new File("/Users/juliansilvestre/eclipse-workspace/ProgrammingExercise4/src/ProgrammingExercise4TextFile.txt");
        Scanner scan = new Scanner(textFile);
        String line = scan.nextLine();
        String[] wordsInFile = new String[7];
        String pigLatin = "";

        for (int i = 0; i < wordsInFile.length; i++) {
            wordsInFile = line.split(" ");
            translatePigLatin(wordsInFile[i], pigLatin);
            System.out.println(wordsInFile[i] + "\t" + pigLatin);
        }

    }

    public static  String translatePigLatin(String english, String pigLatin) {
        String upperCaseWord = english.toUpperCase();
        int index = -1;
        char ch;

        for (int i = 0; i < upperCaseWord.length(); i++) {
            ch = upperCaseWord.charAt(i);

            if (isVowel(ch)) {
                index = i;
                break;
            }
        }

        if (index == 0) {
            return pigLatin = upperCaseWord + "WAY";
        }
        else {
            String x = english.substring(index);
            String y = english.substring(0, index);
            return pigLatin = x + y + "AY";
        }
    }

    public static Boolean isVowel(char ch) {
        if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
            return true;
        }
        return false;
    }

}

【问题讨论】:

  • 这与问题并没有太大关系,但猪拉丁的目的是什么?
  • @RyanStone - 对于另一个网站来说,这可能是一个更好的问题

标签: java


【解决方案1】:

您永远不会分配返回值。我认为你的函数应该是这样的:

    wordsInFile = line.split(" ");
    for (int i = 0; i < wordsInFile.length; i++) {
        String pigLatin = translatePigLatin(wordsInFile[i]);
        System.out.println(wordsInFile[i] + "\t" + pigLatin);
    }


public static String translatePigLatin(String english) {
   //Do translation logic
   return "YourResultString";
}

您不需要第二个方法参数。将该方法视为一个黑盒,它有一些(需要的)输入并产生一个输出(没有副作用)。

Java 中的字符串是不可变的。看到这个问题:can-i-change-string-objects-value-passed-to-my-method

编辑:感谢您的评论,将split 放在循环之外。

【讨论】:

  • 谢谢!感谢您的帮助!
  • 将赋值 wordsInFile = line.split(" "); 放在循环之外。
【解决方案2】:

这是适合您的有效解决方案。 一:您的文件阅读器代码不正确。您需要使用 BufferReader 来读取文件。扫描仪用于从控制台读取输入。此外,扫描仪 obj 从未分配给 for 循环中使用的 String 数组。这就是为什么您必须收到空指针异常的原因。 二:我从您的翻译器中删除了很多冗余代码。没有必要使用索引。最终 if 和 else 语句都会给你相同的输出,所以你不需要它。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class PigLatinTranslator {

    public static void main(String[] args) throws FileNotFoundException {
        String[] wordsInFile = readFile("/Users/....").split(" ");
        String pigLatin = "";

        for (int i = 0; i < wordsInFile.length; i++) {
            pigLatin = translatePigLatin(wordsInFile[i]);
            System.out.println(wordsInFile[i] + "\t" + pigLatin);
        }

    }

    public static String readFile(String filename) {
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(filename));
            try {
                String line = br.readLine();

                while (line != null) {
                    sb.append(line);
                    line = br.readLine();
                }
                return sb.toString();
            } finally {
                br.close();
            }
        }
        catch (Exception e){
            sb.append("");
        }
        return sb.toString();
    }

    public static String translatePigLatin(String english) {
        String upperCaseWord = english.toUpperCase();
        char ch;

        for (int i = 0; i < upperCaseWord.length(); i++) {
            ch = upperCaseWord.charAt(i);

            if (isVowel(ch)) {
                return english.substring(i).toUpperCase() + "WAY";
            }
        }
        return "";
        }

    public static Boolean isVowel(char ch) {
        if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
            return true;
        }
        return false;
    }

}

干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多