我有一个Java任务(取自Programming Pearls),我必须从文本文件中获取输入(使用Scanner和FileReader对象),删除所有标点符号和数字,然后创建一个ArrayList,每个单词按字母顺序按升序排序。然后,我必须打印出每个单词,后跟一个带有单词重复次数(出现次数)的数字,然后删除重复项。
我的问题是我正在使用的replaceAll()方法确实删除了所有内容,但有一个意想不到的后果。我的文本中的数字被转换为空白标记(单词),然后插入到我的ArrayList中。当我检查ArrayList字段时,它显示为“”。
我尝试了各种不同的正则表达式,结果相同。任何人都知道为什么会这样,以及如何避免它?
这是代码摘录:dictionary是ArrayList对象,inFile是Scanner对象。
dictionary.add(inFile.next().toString().toLowerCase().replaceAll("[^a-zA-z]", "").trim());
非常感谢
对不起大家。我的错。是的,应该是这样的a-zA-Z。但没有变化。这是代码和输出:
public class Dictionary
{
private List <String> dictionary;
private Scanner inFile;
public Dictionary()
{
this.dictionary = new ArrayList<String>();
}
public void parseText ()
{
inFile = new Scanner (new FileReader("C:\\Users\\User\\Desktop\\Ovid.txt"));
while (inFile.hasNext())
dictionary.add(inFile.next().toString().toLowerCase().replaceAll("[^a-zA-Z]", "").trim());
Collections.sort(dictionary);
}
这是输出(来自print语句):
dictiona1.parseText();在夜晚凉爽的微风中,夜莺唱歌
甜美的歌
正如你所看到的,在“唱”后有一个空白行。在未解析的文本中有一个数字(“...唱17首甜美歌曲”)。检查ArrayList时确认了同样的情况。
非常感谢。
这是代码的预期行为。你正在使用的replaceAll(regex, "")
说用一个空的String
“”替换每个非a-z字的出现。然后将空字符串添加到List
。在添加List的值时,您可以避免写入空String
。打破你的代码(你应该总是按照最佳实践),并在向List添加值时,进行检查,以便只将非空值插入List
。
String next = inFile.next().toLowerCase();
String replaced = next.replaceAll("[^a-zA-Z]", "").trim();
if(!replaced.equals("")){
dictionary.add(replaced);
}
我不能对你唱完后的新行做出任何猜测,直到你提供你正在使用的输入字符串。
希望有所帮助