Java 我如何去掉这些空字符串?

Java 我如何去掉这些空字符串?,java,string,bufferedreader,Java,String,Bufferedreader,我的构造函数获取文本文件的文件名,并将其转换为包含所有小写单词的ArrayList,无标点符号或空格。这些规范以及构造函数的参数都是由我的家庭作业指定的,所以不要建议我更改它们 私有数组列表; 公共标记器(字符串文件)引发IOException{ 列表=新的ArrayList(); 把这条线串起来; BufferedReader br=新的BufferedReader(新文件读取器(文件)); 而((thisLine=br.readLine())!=null) addAll(Arrays.asL

我的构造函数获取文本文件的文件名,并将其转换为包含所有小写单词的
ArrayList
,无标点符号或空格。这些规范以及构造函数的参数都是由我的家庭作业指定的,所以不要建议我更改它们

私有数组列表;
公共标记器(字符串文件)引发IOException{
列表=新的ArrayList();
把这条线串起来;
BufferedReader br=新的BufferedReader(新文件读取器(文件));
而((thisLine=br.readLine())!=null)
addAll(Arrays.asList(thisLine.replaceAll(“\\p{Punct}+”,”).toLowerCase().split(“\\s+”));
}
我的问题是出现了许多空字符串。我试过在“split”中使用“-1”作为第二个参数,但它似乎没有任何作用

我的另一个问题是执行
数组.asList
是否效率低下,或者我是否应该创建一个迭代器,再加上您是否认为我做了任何其他错误的事情。例如,是否有其他方法将文件名输入到
BufferedReader

谢谢

编辑1:

下面是我在古腾堡项目上找到的一本在线书(这是一个文本文件,文本文件没有问题)中使用的测试。在使用我个人创建的文本文件时,我也会得到类似的结果,所以不要认为文本文件本身有问题

事实上,我将复制我的整个代码,因为它非常简单:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

public class Tokenizer {
    private ArrayList<String> list;

    public Tokenizer(String file) throws IOException {
        list = new ArrayList<>();
        String thisLine;
        BufferedReader br = new BufferedReader(new FileReader(file));

        while ((thisLine = br.readLine()) != null)
            list.addAll(Arrays.asList(thisLine.replaceAll("\\p{Punct}+"," ").toLowerCase().trim().split("\\s+")));
    }

    public ArrayList<String> wordList() {
        return list;
    }

    public static void main(String[] args) throws IOException {
        Tokenizer T = new Tokenizer("C:\\...\\1898amongmyb00loweuoft_djvu.txt");

        ArrayList<String> array = T.wordList();

        for(int i = 0; i < 20; i++) {
            System.out.println(array.get(i));
        }
    }
}
不,那些空行不是空白。它们是空字符串。如“”。我希望我尽可能清楚

因为它可能会引起混淆,所以不,这不是我用于文件路径名的实际参数。省略号(“…”)只是一个简写,所以我不必向互联网透露我的计算机目录

另外,是的,最后还有一个空字符串,但是这个网站的界面不允许我把它放在那里

编辑2:

我总是忘记一些事情,下面是文本文件的前几行:

I 9

互联网档案数字化

2007年,由

微软公司

詹姆斯·埃特斯克尔·洛托克尔

完整的诗歌和散文作品。河边 版本,n卷,皇冠8vo,镀金顶部,每个$1.50;布景, $ 1 6. 50.

1-4。文学随笔(包括我的书房窗口等) 我的书,炉边旅行);5.政治论文;6.文学的 和政治演说;7.最新文学论文和广告- 服装,古英国剧作家;8-1 1. 诗歌

散文作品。河滨版。用肖像画。7卷, 皇冠8vo,镀金上衣,10.50美元

诗歌。河滨版。用肖像画。4卷,皇冠 8vo,镀金上衣,6.00美元

完整的诗作。剑桥版。 在不透明纸上以透明字体印刷,美观大方 跳跃带有肖像和雕刻的标题页,以及 洛厄尔家的小插曲,埃尔姆伍德。大皇冠8vo,2.00美元。 家庭版。有肖像和插图。王冠 8vo,1.50美元

内阁版。i8

我想我现在明白了问题所在。空字符串对应于空行

编辑3:

所以我最终回答了自己的问题。我最终做了这样的事:

while ((thisLine = br.readLine()) != null) {
        ArrayList<String> newList = new ArrayList(Arrays.asList(thisLine.replaceAll("\\p{Punct}+"," ").toLowerCase().split("\\s+")));
        while(newList.remove(""));     
        list.addAll(newList);
    }
while((thisLine=br.readLine())!=null){
ArrayList newList=newArrayList(Arrays.asList(thisLine.replaceAll(“\\p{Punct}+”,”).toLowerCase().split(“\\s+”));
while(newList.remove(“”);
list.addAll(newList);
}
我确实尝试过使用if语句,但是您正在比较拆分前的行。这可能是有问题的,因为拆分可能会产生一些空行,您可能会错过这些空行。因此,我创建了我要添加到主列表中的列表,但在添加它之前,我只是浏览了一下并删除了所有空字符串的实例


我真的不知道这是否是最有效的做事方式。。。如果它不让我知道

您的问题很可能是从文件中读取的
此行的开头或结尾有空格。文本文档中有这样的行是很常见的。因此,如果在
\s+
上调用split,并且该行以空格结尾,那么最后一件事将是一个空字符串

为了解决这个问题,我建议在你做分割之前在你的绳子上加一个修剪

使用您的代码将其更改为:

list.addAll(Arrays.asList(thisLine.replaceAll("\\p{Punct}+"," ").toLowerCase().trim().split("\\s+")));

试试看,如果不是所有的空字符串,它是否能去除大部分空字符串。此外,您应该考虑将此语句分解为多个操作,以便更容易阅读。

< P>如何替换<代码>((此行=BR.Read Load())=空) list.addAll(Arrays.asList(thisLine.replaceAll(“\\p{Punct}+”,”).toLowerCase().trim().split(“\\s+”))

with:
while((thisLine=br.readLine())!=null)
如果(thisLine.length()>0)

list.addAll(Arrays.asList(thisLine.replaceAll(“\\p{Punct}+”,”).toLowerCase().trim().split(“\\s+”))

空字符串是否用“”空格填充?如果长度为0,则它是一个完全空的字符串。根据我的理解,这就是通常所说的空字符串。里面没有东西的绳子。天啊,我没想到它会引起混淆。
thisLine.replaceAll(“\\p{Punct}+”,“”)
这不会产生空字符串,除非
thisLine
是一个空字符串开始。这就是为什么要问这个问题。如果你给出了一个导致问题的示例句子,并给出了列表输出,这样我们就可以看到不管出于什么原因空字符串被放在哪里。@Compass,产生空字符串的东西被拆分了。我知道这一点有很多原因,包括我已经测试过它。replaceAll没有给任何麻烦。所以我尝试了这个,但仍然得到了空字符串。我不知道你是否这样想,但是中间出现了空字符串
list.addAll(Arrays.asList(thisLine.replaceAll("\\p{Punct}+"," ").toLowerCase().trim().split("\\s+")));