0

我正在处理一个非常巧妙的问题挑战,其中涉及从 .txt 文件中读取单词。该程序必须允许读取任何 .txt 文件,因此程序无法预测它将处理哪些单词。

然后,它把这些词变成他们的“Pig Latin”对应词,并将它们写入一个新文件。这个问题还有很多要求,但我只想说,我已经解决了每个部分,保存一个......当打印到新文件时,我无法保持行距。也就是说,如果第 1 行有 5 个单词,然后有一个 break,第 2 行有 3 个单词和一个 break……对于新文件也必须如此。就目前而言,一切正常,但所有转换后的单词都一个接一个地列出。

我有兴趣学习这个,所以如果你们都想在你的答案中表现得害羞,我可以。虽然我已经在这工作了 9 个小时,所以“半腼腆”也会受到重视 :) 请密切注意代码中的“while”语句,这是文件 IO 操作发生的地方。我想知道是否需要使用扫描仪中的 nextLine() 命令,然后从中创建一个字符串……然后从 nextLine() 字符串中创建子字符串,以一次一个地转换单词。子字符串可能是拆分或标记,或其他东西 - 我不清楚这部分和标记尝试给我编译器错误异常“java.util.NoSuchElementException” - 我似乎不理解拆分命令的正确调用。我尝试了类似 String a = scan.nextLine() 的东西,其中“scan”是我的扫描仪变量。然后尝试了 String b = a.split() 不行。无论如何,这是我的代码,看看你是否能弄清楚我错过了什么。

这是代码,非常感谢您提前Java神......

import java.util.*;
import javax.swing.*;
import java.io.*;
import java.text.*;

public class PigLatinTranslator
{
    static final String ay = "ay"; // "ay" is added to the end of every word in pig latin

    public static void main(String [] args) throws IOException
    {
        File nonPiggedFile = new File(...);
        String nonPiggedFileName = nonPiggedFile.getName();
        Scanner scan = new Scanner(nonPiggedFile);  

        nonPiggedFileName = ...;

        File pigLatinFile = new File(nonPiggedFileName + "-pigLatin.txt"); //references a file that may or may not exist yet

        pigLatinFile.createNewFile();
        FileWriter newPigLatinFile = new FileWriter(nonPiggedFileName + "-pigLatin.txt", true);
        PrintWriter PrintToPLF = new PrintWriter(newPigLatinFile);

        while (scan.hasNext()) 
        {
            boolean next;
            while (next = scan.hasNext()) 
            {
                 String nonPig = scan.next();
                 nonPig = nonPig.toLowerCase();
                 StringBuilder PigLatWord = new StringBuilder(nonPig);
                 PigLatWord.insert(nonPig.length(), nonPig.charAt(0) );
                 PigLatWord.insert(nonPig.length() + 1, ay);
                 PigLatWord.deleteCharAt(0);
                 String plw = PigLatWord.toString();

                 if (plw.contains("!") )
                 {
                     plw = plw.replace("!", "") + "!";
                 }

                 if (plw.contains(".") )
                 {
                     plw = plw.replace(".", "") + ".";
                 }

                 if (plw.contains("?") )
                 { 
                     plw = plw.replace("?", "") + "?"; 
                 }

                 PrintToPLF.print(plw + " ");
            }

            PrintToPLF.close();
        }
    }
}
4

2 回答 2

1

使用BufferedReader,不使用Scannerhttp://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html

我把这部分作为原始海报的练习,一旦你知道使用正确的类就很容易了!(希望你能学到一些东西,而不是复制粘贴我的代码)。

然后将整行传递给这样的函数:(请注意,这不能正确处理引号,因为它将所有非撇号标点符号放在单词的末尾)。它还假设标点符号应该放在单词的末尾。

private static final String vowels = "AEIOUaeiou";
private static final String punct = ".,!?";

public static String pigifyLine(String oneLine) {
   StringBuilder pigified = new StringBuilder();
   boolean first = true;
   for (String word : oneLine.split(" ")) {
       if (!first) pigified.append(" ");
       pigified.append(pigify(word));
       first = false;
   }
   return pigified.toString();
}

public static String pigify(String oneWord) {
    char[] chars = oneWord.toCharArray();
    StringBuilder consonants = new StringBuilder();
    StringBuilder newWord = new StringBuilder();
    StringBuilder punctuation = new StringBuilder();
    boolean consDone = false; // set to true when the first consonant group is done

    for (int i = 0; i < chars.length; i++) {
        // consonant
        if (vowels.indexOf(chars[i]) == -1) {
            // punctuation
            if (punct.indexOf(chars[i]) > -1) {
                punctuation.append(chars[i]);
                consDone = true;
            } else {
                if (!consDone) { // we haven't found the consonants
                    consonants.append(chars[i]);
                } else {
                    newWord.append(chars[i]);
                }
            }
        } else {
            consDone = true;
            // vowel
            newWord.append(chars[i]);
        }
    }

    if (consonants.length() == 0) {
        // vowel words are "about" -> "aboutway"
        consonants.append("w");
    } 
    consonants.append("ay");

    return newWord.append(consonants).append(punctuation).toString();
}
于 2012-11-02T04:27:44.020 回答
0

您可以尝试将每行的字数存储在单独的数据结构中,并在编写文件时将其用作何时移至下一行的指南。

我故意为你做了这个半模糊的,但可以根据要求详细说明。

于 2012-11-02T01:04:26.260 回答