我正在处理一个非常简洁的问题挑战,涉及从.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();
}
}
}
答案 0 :(得分:1)
使用BufferedReader
,而不是Scanner
。 http://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)
您可以尝试将每行的单词数存储在单独的数据结构中,并将其用作在编写文件时何时移动到下一行的指南。
我故意为你做了这个半模糊,但可以根据要求详细说明。