replaceAll()方法删除数字,但添加空白标记

时间:2017-12-20 17:49:50

标签: java arraylist tokenize replaceall

我有一个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时确认了相同的内容。

非常感谢。

1 个答案:

答案 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);        
}

我无法猜测你唱完后的新行,直到你提供你正在使用的输入字符串。

希望有所帮助