【问题标题】:Reading from a file and excluding words using Scanner使用扫描仪从文件中读取并排除单词
【发布时间】:2017-09-16 10:06:38
【问题描述】:

我目前正在尝试编写一个程序来计算文本中使用不同单词的次数,然后将这些值附加到哈希图中。在程序的主要部分,我使用扫描仪读取带有文本的文件,然后使用另一个扫描仪启动 GenWordCtr,该扫描仪应该读取包含我想要排除的单词的文件(像“这个,她,那个”这样的词)。我确保发送到 op.process 的字符串是小写的,但是当我运行程序时,它仍然会添加我想要从统计信息中排除的所有值。我究竟做错了什么?我知道主程序可以工作,我用单个单词尝试过。

TLDR - 我希望使用扫描仪排除的单词以读取文本,由于某种原因,它们没有被排除在我的程序的“进程”操作中。

    package textproc;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Holgersson {

    public static final String[] REGIONS = { "blekinge", "bohuslän", "dalarna", "dalsland", "gotland", "gästrikland",
            "halland", "hälsingland", "härjedalen", "jämtland", "lappland", "medelpad", "närke", "skåne", "småland",
            "södermanland", "uppland", "värmland", "västerbotten", "västergötland", "västmanland", "ångermanland",
            "öland", "östergötland" };

    public static void main(String[] args) throws FileNotFoundException {

        Scanner s = new Scanner(new File("../lab1/nilsholg.txt"));
        Scanner stopwords = new Scanner(new File("undantagsord.txt"));
        s.useDelimiter("(\\s|,|\\.|:|;|!|-|\\?|'|\\\")+"); // se handledning

        TextProcessor gen = new GeneralWordCounter(stopwords);

        while (s.hasNext()) {
            String word = s.next().toLowerCase();

            gen.process(word);

        }

        s.close();

        gen.report();
    }
}


package textproc;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class GeneralWordCounter implements TextProcessor {

    private Map<String, Integer> m;
    private Scanner excep;

    GeneralWordCounter(Scanner r){
        Map<String, Integer> m = new HashMap<String, Integer>();
        this.m = m;
        excep = r;
    }

    @Override
    public void process(String word) {
        // TODO Auto-generated method stub
        boolean bin = false;
        while(excep.hasNext() && bin == false) {
            if(word.equals(excep.next().toLowerCase())) {
                bin = true;
            }
        }
        if(!bin) {
            if(m.containsKey(word)) {
                m.put(word, (m.get(word) + 1));
            }
            else {
                m.put(word, 1);
            }
        }
    }

    @Override
    public void report() {
        // TODO Auto-generated method stub
        for(String key : m.keySet()) {
            if(m.get(key) >= 200) {
            System.out.println(key + " - " + m.get(key));
            }
        }
    }

}

【问题讨论】:

  • 在我看到实际的输入和输出之前,很难理解你的代码逻辑
  • 来自扫描仪的输入?以下是它们的示例: 扫描仪主程序(正在处理的字符串):“Den signade dag, som vi nu här se av himmelen until oss nedkomma, han blive oss säll” 扫描仪异常(有例外的文本):han hon en ett och att det i som hade på de inte var den sig så för
  • 你需要分享你的完整代码。
  • 完成,代码分为两个不同的类,我认为我在第二类的过程部分做错了,这就是为什么我只发布它^^

标签: java string hashmap compare java.util.scanner


【解决方案1】:

您在循环内为 stopwords 使用相同的 Scanner 实例,这可能会在以下几个循环中耗尽。

 TextProcessor gen = new GeneralWordCounter(stopwords);

    while (s.hasNext()) {
        String word = s.next().toLowerCase();

        gen.process(word);

    }

以这种方式想象,您已经开始了上述循环并传递了 Scanner 实例,当您调用 process 方法时,它开始循环逐字并到达第二个 Scanner 的文件末尾。现在,在下一个循环中,您再次调用了process 方法,但是这个时间指针将已经在文件的末尾,因为您正在使用相同的实例。所以,你不会得到预期的输出。

相反,您需要为每个 process 方法调用创建新的 Scanner 实例。

 public void process(String word) {
     Scanner excep = new Scanner(new File("undantagsord.txt"));
      // your code.

【讨论】:

  • 啊,是的,这是有道理的。我只是通过将所有单词保存到我在 GenWordCtr 的构造函数中启动的数组列表来解决问题,有没有更好的方法来解决它只使用扫描仪或者数组列表是最平滑的替代方案?
  • 我认为,ArrayList 会比 Scanner 更好。
猜你喜欢
  • 2016-03-02
  • 2013-12-04
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多