0

私は、.txtファイルから単語を読み取ることを含む非常に巧妙な問題の課題に取り組んでいます。プログラムは、任意の.txtファイルの読み取りを許可する必要があります。プログラムは、処理する単語を予測できません。

次に、単語を取得して「Pig Latin」に対応させ、新しいファイルに書き込みます。この問題にはさらに多くの要件がありますが、1つを除いてすべての部分を解決しました...新しいファイルに印刷するときに、行間隔を維持できません。つまり、1行目に5ワードがあり、次にブレークがあり、2行目に3ワードとブレークがある場合、新しいファイルについても同じことが当てはまる必要があります。現在のところ、すべて機能しますが、変換されたすべての単語が次々にリストされます。

私はこれを学ぶことに興味があるので、あなたがあなたの答えで恥ずかしがり屋を演じることを望むならば、私は大丈夫です。私はこれに9時間参加しているので、「semi-coy」も評価されます:)ファイルIOアクションが発生しているコードの「while」ステートメントに細心の注意を払ってください。スキャナーからnextLine()コマンドを利用して、それから文字列を作成する必要があるかどうか疑問に思っています...次に、nextLine()文字列からサブ文字列を作成して、単語を1つずつ変換します。サブストリングは、分割またはトークン、あるいは他の何かである可能性があります-この部分については不明であり、トークンの試行により、コンパイラのエラー例外「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

1行あたりの単語数を別のデータ構造に格納し、ファイルを書き込むときに次の行に移動するタイミングのガイドとして使用することができます。

私は意図的にこれをあなたのために半曖昧にしましたが、要求に応じて詳しく説明することができます。

于 2012-11-02T01:04:26.260 に答える