【发布时间】:2015-06-07 06:16:19
【问题描述】:
我已经为此工作了几天,但我无法取得任何进展。我尝试过使用 Scanner 和 BufferedReader,但没有成功。
基本上,我有一个工作方法(shortenWord),它接受一个字符串并根据格式如下的文本文件缩短它:
hello,lo
any,ne
anyone,ne1
thanks,thx
它还考虑了标点符号,所以“你好?”变成“lo?”等等
我需要能够读取字符串并单独翻译每个单词,所以“你好?任何人都谢谢!”将变为“lo?ne ne1 thx!”,基本上使用我对字符串中每个单词已有的方法。我拥有的代码将翻译第一个单词,但对其余部分没有任何作用。我认为这与我的 BufferedReader 的工作方式有关。
import java.io.*;
public class Shortener {
private FileReader in ;
/*
* Default constructor that will load a default abbreviations text file.
*/
public Shortener() {
try {
in = new FileReader( "abbreviations.txt" );
}
catch ( Exception e ) {
System.out.println( e );
}
}
public String shortenWord( String inWord ) {
String punc = new String(",?.!;") ;
char finalchar = inWord.charAt(inWord.length()-1) ;
String outWord = new String() ;
BufferedReader abrv = new BufferedReader(in) ;
// ends in punctuation
if (punc.indexOf(finalchar) != -1 ) {
String sub = inWord.substring(0, inWord.length()-1) ;
outWord = sub + finalchar ;
try {
String line;
while ( (line = abrv.readLine()) != null ) {
String[] lineArray = line.split(",") ;
if ( line.contains(sub) ) {
outWord = lineArray[1] + finalchar ;
}
}
}
catch (IOException e) {
System.out.println(e) ;
}
}
// no punctuation
else {
outWord = inWord ;
try {
String line;
while( (line = abrv.readLine()) != null) {
String[] lineArray = line.split(",") ;
if ( line.contains(inWord) ) {
outWord = lineArray[1] ;
}
}
}
catch (IOException ioe) {
System.out.println(ioe) ;
}
}
return outWord;
}
public void shortenMessage( String inMessage ) {
String[] messageArray = inMessage.split("\\s+") ;
for (String word : messageArray) {
System.out.println(shortenWord(word));
}
}
}
非常感谢任何帮助,甚至是朝着正确方向轻推。
编辑:我尝试在 shortWord 方法的末尾关闭 BufferedReader,但在第一个说 BufferedReader 已关闭之后,它只会导致我在字符串中的每个单词上都出现错误。
【问题讨论】:
-
在一个不相关的旁注中:我想像这样的单词缩短器是任何英语老师的噩梦燃料。
-
对于每个单词一次又一次地读取文件是没有意义的,而且你实际上并没有这样做,因为一旦你到达文件的末尾,如果你不重新打开它或倒带它,它将停留在文件的末尾。更好的逻辑是打开文件,读取一行,然后将替换应用到每一行。
-
或阅读“翻译”到
Map<String, String>。还有你到底为什么用String punc = new String(",?.!;") ;而不是String punc = ",?.!;";? -
啊,好吧,我明白你在说什么。我试图以这种方式实现它,因为我认为使用 shortWord 方法来节省再次写出逻辑会更好。我现在要试试你的方法,然后会报告!编辑:我还是 Java 新手,有时我会犯像 String 这样的愚蠢错误,如果它们有效,我通常不会识别出足以改变它的“坏”代码。 (我现在已经修好了,谢谢!)
-
我不明白为什么它不起作用,你有一个用于此目的的调试器。我只能说你赚的比现在要难得多。您对以标点符号结尾的单词重复exact 代码,而对于没有标点符号的单词重复。没有用。去掉你的标点符号,记住它们。必须根据您的任何“字典”检查没有标点符号的单词,并在必要时进行替换。然后添加之前删除的标点符号。
标签: java bufferedreader