从文件中读取并使用Scanner排除单词

时间:2017-09-16 10:06:38

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

我目前正在尝试编写一个程序来计算文本中使用不同单词的次数,然后将这些值附加到散列图。在程序的主要部分,我使用扫描仪读取带有文本的文件,然后我用另一个扫描仪启动GenWordCtr,该扫描仪应该在一个文件中读取我想要排除的单词(像“this,her,that”这样的单词) )。我已经确保发送到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));
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您在循环内部使用stopwords的相同扫描程序实例,这可能会在少数以下循环中耗尽。

 TextProcessor gen = new GeneralWordCounter(stopwords);

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

        gen.process(word);

    }

想象一下,你已经开始上面循环并传递了Scanner实例,当你调用process方法时,它开始循环搜索并到达第二个扫描程序的文件末尾。现在,在下一个循环中,您再次调用process方法,但是当您使用相同的实例时,此时指针将位于文件的末尾。所以,你不会得到预期的输出。

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

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