replaceAll() 方法删除数字,但添加空白标记
replaceAll() method removes digits, but adds blank token
我有一个 Java 作业(取自 Programming Pearls),我必须从文本文件中获取输入(使用 Scanner 和 FileReader objects),删除所有标点符号和数字,然后创建一个 ArrayList,每个单词按字母顺序升序排列。然后,我必须打印出每个单词后跟一个带有单词重复(出现)次数的数字,并删除重复项。
我的问题是,我使用的 replaceAll() 方法确实按预期删除了所有内容,但产生了一个意想不到的后果。我的文本中的数字被转换成一个空白标记(单词),然后插入到我的 ArrayList 中。当我检查 ArrayList 字段时,它显示为“”。
我试过各种不同的正则表达式,结果都是一样的。任何人都知道为什么会发生这种情况以及如何避免这种情况?
这是代码摘录:
dictionary 是 ArrayList object 和 inFile 是 Scanner object.
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();
在
这
凉爽的
凉爽的
breeze
的
这
晚上
这
夜莺
桑
甜蜜
歌曲
如你所见,在"sang"之后有一个空行。在未解析的文本中有一个数字(“...唱了 17 首甜美的歌曲”)。当我检查 ArrayList 时也确认了这一点。
非常感谢。
这是您的代码的预期行为。您正在使用的 replaceAll(regex, "")
表示将每个出现的非 a-z 词替换为空的 String
“”。然后将该空字符串添加到 List
。
您可以在添加 List 的值时避免写入空 String
。
打破您的 while 代码(根据最佳实践,您应该始终这样做)并在向列表添加值时进行检查,以便仅将非空值插入到 List
.
String next = inFile.next().toLowerCase();
String replaced = next.replaceAll("[^a-zA-Z]", "").trim();
if(!replaced.equals("")){
dictionary.add(replaced);
}
在你提供你正在使用的输入字符串之前,我无法猜测你在 sang 之后得到的换行符。
希望对您有所帮助
我有一个 Java 作业(取自 Programming Pearls),我必须从文本文件中获取输入(使用 Scanner 和 FileReader objects),删除所有标点符号和数字,然后创建一个 ArrayList,每个单词按字母顺序升序排列。然后,我必须打印出每个单词后跟一个带有单词重复(出现)次数的数字,并删除重复项。
我的问题是,我使用的 replaceAll() 方法确实按预期删除了所有内容,但产生了一个意想不到的后果。我的文本中的数字被转换成一个空白标记(单词),然后插入到我的 ArrayList 中。当我检查 ArrayList 字段时,它显示为“”。
我试过各种不同的正则表达式,结果都是一样的。任何人都知道为什么会发生这种情况以及如何避免这种情况?
这是代码摘录: dictionary 是 ArrayList object 和 inFile 是 Scanner object.
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(); 在 这 凉爽的 凉爽的 breeze 的 这 晚上 这 夜莺 桑
甜蜜 歌曲
如你所见,在"sang"之后有一个空行。在未解析的文本中有一个数字(“...唱了 17 首甜美的歌曲”)。当我检查 ArrayList 时也确认了这一点。
非常感谢。
这是您的代码的预期行为。您正在使用的 replaceAll(regex, "")
表示将每个出现的非 a-z 词替换为空的 String
“”。然后将该空字符串添加到 List
。
您可以在添加 List 的值时避免写入空 String
。
打破您的 while 代码(根据最佳实践,您应该始终这样做)并在向列表添加值时进行检查,以便仅将非空值插入到 List
.
String next = inFile.next().toLowerCase();
String replaced = next.replaceAll("[^a-zA-Z]", "").trim();
if(!replaced.equals("")){
dictionary.add(replaced);
}
在你提供你正在使用的输入字符串之前,我无法猜测你在 sang 之后得到的换行符。
希望对您有所帮助