保留文件IO中的换行符和间距

时间:2012-11-02 00:58:59

标签: java io tokenize substring

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

然后,它接受单词并使它们成为“Pig Latin”对应物,并将它们写入新文件。对这个问题还有很多要求,但是我要说,每个部分都解决了一个...当打印到新文件时我无法坚持行间距。也就是说,如果第1行有5个单词然后有一个中断而第2行有3个单词并且中断...对于新文件必须相同。现在看来,一切正常,但所有转换后的单词都是一个接一个地列出来的。

我有兴趣学习这个,所以我很好,如果你们都希望在你的答案中羞怯。虽然我已经在这里工作了9个小时,所以“半腼腆”也会被贬低:)请密切注意代码中的“while”语句,这是发生文件IO操作的地方。我想知道我是否需要利用来自扫描程序的nextLine()命令,然后关闭该字符串...然后从nextLine()字符串中创建子字符串以一次转换一个字。子串可能是分裂或标记,或其他东西 - 我不清楚这一部分和令牌尝试给我编译器arrors异常“java.util.NoSuchElementException” - 我似乎不理解正确调用split命令。我试过像String a = scan.nextLine()这样的东西,其中“scan”是我的扫描仪var。然后尝试了String b = a.split()没有去。无论如何这里是我的代码,看看你是否能弄清楚我错过了什么。

以下是代码,非常感谢Java gods ....

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();
        }
    }
}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

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