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

问题描述 投票:0回答:1

我有一个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时确认了同样的情况。

非常感谢。

java arraylist tokenize replaceall
1个回答
0
投票

这是代码的预期行为。你正在使用的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);        
}

我不能对你唱完后的新行做出任何猜测,直到你提供你正在使用的输入字符串。

希望有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.