【问题标题】:How do I get rid of these empty strings?如何摆脱这些空字符串?
【发布时间】:2014-11-04 17:50:55
【问题描述】:

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

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().split("\\s+")));
}

我的问题是出现了很多空字符串。我尝试使用“-1”作为“split”中的第二个参数,但它似乎没有做任何事情。

我的另一个问题是 Arrays.asList 是否效率低下,或者我是否应该创建一个迭代器,以及如果您认为我做错了什么。例如,是否有另一种方法可以在BufferedReader 中输入文件名?

谢谢

编辑 1:

以下是我在 Gutenberg 项目中找到的用于在线书籍的测试(它是一个文本文件,文本文件没有问题)。当使用我个人创建的文本文件时,我也得到了类似的结果,所以不要认为它是文本文件本身的问题。

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

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

这是我的输出:

i
9



digitized
by
the
internet
archive

in
2007
with
funding
from

microsoft
corporation

不,那些空行不是空白。它们是空字符串。如,“”。我希望我尽可能清楚。

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

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

编辑 2:

我总是忘记一些东西,这是文本文件的前几行:

我 9

由互联网档案馆数字化

2007 年,由

资助

微软公司

http://www.archive.org/details/1898amongmyb00loweuoft

James Ettsscll Lotocll。

完整的诗歌和散文作品。河边 版本,n vols,crown 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);
    }

我确实尝试过使用 if 语句,但是您正在比较拆分前的行。这可能是有问题的,因为拆分可能会产生一些您会错过的空行。因此,我制作了要添加到主列表中的列表,但在添加之前,我只是浏览了它并删除了所有空字符串的实例。

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

【问题讨论】:

  • 空字符串用''空格填充?您可以 trim() ,如果长度为 0 则它是一个完全空的字符串。
  • 通过空字符串,我的意思是“”。据我了解,这通常是空字符串的含义。里面什么都没有的绳子。天哪,我不认为这会引起混乱。
  • thisLine.replaceAll("\\p{Punct}+"," ") 这不会产生一个空字符串,除非thisLine 是一个空字符串开头。因此,为什么要问这个问题。
  • @Compass,产生空字符串的东西被分割了。我知道这一点有多种原因,包括我已经测试过它。 replaceAll 没有任何问题。

标签: java string bufferedreader


【解决方案1】:

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

要解决此问题,我建议在拆分之前在字符串上添加修剪。

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

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

尝试一下,看看它是否不能消除大部分(如果不是全部)空字符串。此外,您应该考虑将此语句分解为多个操作,以便于阅读。

【讨论】:

  • 所以我尝试了这个,但我仍然得到空字符串。我不知道你是否这么认为,但空字符串出现在列表的中间,而不是末尾。它们出现的原因对我来说并不明显。
【解决方案2】:

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

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

【讨论】:

  • 我已经尝试过类似的方法。这样做的问题是有可能从“split”中获取空字符串,然后将其遗漏并添加到 ArrayList 中。
  • 如果是这种情况,您需要在完成拆分后丢弃它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2014-03-24
  • 1970-01-01
相关资源
最近更新 更多