我有一个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时确认了相同的内容。
非常感谢。
答案 0 :(得分:0)
这是代码的预期行为。您正在使用的replaceAll(regex, "")
表示将每个出现的非a-z字替换为空String
“”。然后将该空字符串添加到List
。
在添加List的值时,您可以避免写入空String
。
打破你的代码(你应该总是按照最佳实践)并在向List添加值时,进行检查,以便只将非空值插入List
。
String next = inFile.next().toLowerCase();
String replaced = next.replaceAll("[^a-zA-Z]", "").trim();
if(!replaced.equals("")){
dictionary.add(replaced);
}
我无法猜测你唱完后的新行,直到你提供你正在使用的输入字符串。
希望有所帮助