【问题标题】:Calculating Word Frequency Using StreamTokenizer () , HashMap() , HashSet(). in Java Core使用 StreamTokenizer () 、 HashMap() 、 HashSet() 计算词频。在 Java 核心
【发布时间】:2019-03-10 10:44:08
【问题描述】:
import java.io.*;
import java.util.*;
class A {
    public static void main(String args[]) throws Exception {
        Console con = System.console();
        String str;
        int i=0;
  
        HashMap map = new HashMap();
        HashSet set = new HashSet();
 
        System.out.println("Enter File Name : ");
        str = con.readLine();
        File f = new File(str);
        f.createNewFile();
        
        FileInputStream fis = new FileInputStream(str);
        StreamTokenizer st = new StreamTokenizer(fis);
        while(st.nextToken()!=StreamTokenizer.TT_EOF) {
         String s;
    
         switch(st.ttype) {
             case StreamTokenizer.TT_NUMBER:  s = st.nval+"";
             break;
              case StreamTokenizer.TT_WORD:    s = st.sval;
               break;
                default: s = ""+((char)st.ttype);
            }


            map.put(i+"",s);
            set.add(s);
            i++;
        }
 
        Iterator iter = set.iterator();
        System.out.println("Frequency Of Words :");
        while(iter.hasNext()) {
          String word;
          int count=0;
          word=(String)iter.next();
          
            for(int j=0; j<i ; j++) {
             String word2;
              word2=(String)map.get(j+"");
               if(word.equals(word2))
                count++;
            }
            System.out.println(" WORD : "+ word+" = "+count);
        }
        System.out.println("Total Words In Files: "+i);
    }
}

在这段代码中,首先我已经创建了一个包含以下数据的文本文件:

@Hello Hii World # * c++ java salesforce

这段代码的输出是:

**词频:

字:# = 1

字:@ = 1

字:c = 1

单词:salesforce = 1

字:* = 1

字 : Hii = 1

字:+ = 2

字:java = 1

字:世界 = 1

单词:你好 = 1

文件总字数:11**

我无法找到为什么这会将 c++ 显示为单独的单词。我 想在输出中将 c++ 组合为一个单词

【问题讨论】:

  • 你对“词”的定义是什么?
  • @sweeper words表示txt文件中存在的字符串
  • 是的,但是什么构成一个字?为什么c++ 是一个词? word$$$$ 应该是一个字还是两个字还是五个字?我怎么知道什么是“词”?
  • @sweeper word$$$$ 构成单字
  • @sweeper 帮帮我先生

标签: java hashmap tokenize hashset


【解决方案1】:

你可以这样做

    // Create the file at path specified in the String str
    // ...
    HashMap<String, Integer> map = new HashMap<>();
    InputStream fis = new FileInputStream(str);
    Reader bufferedReader = new BufferedReader(new InputStreamReader(fis));

    StreamTokenizer st = new StreamTokenizer(bufferedReader);
    st.wordChars('+', '+');
    while(st.nextToken() != StreamTokenizer.TT_EOF) {
        String s;

        switch(st.ttype) {
            case StreamTokenizer.TT_NUMBER:
                s = String.valueOf(st.nval);
                break;
            case StreamTokenizer.TT_WORD:
                s = st.sval;
                break;
            default:
                s = String.valueOf((char)st.ttype);
        }
        Integer val = map.get(s);
        if(val == null)
            val = 1;
        else
            val++;
        map.put(s, val);
    }

    Set<String> keySet = map.keySet();
    Iterator<String> iter = keySet.iterator();
    System.out.println("Frequency Of Words :");
    int sum = 0;
    while(iter.hasNext()) {
        String word = iter.next();
        int count = map.get(word);
        sum += count;
        System.out.println(" WORD : " + word + " = " + count);
    }
    System.out.println("Total Words In Files: " + sum);

请注意,我使用泛型而不是原始版本的 HashMap 和 Iterator 更新了您的代码。此外,您用于 StreamTokenizer 的构造函数已被弃用。使用 map 和 set 是没有用的,因为您可以使用 .keySet() 方法迭代 map 的键集。映射现在从 String(单词)变为 Integer(单词数)。

无论如何,关于您所做的示例,我认为简单的拆分方法会更合适。

有关 StreamTokenizer 的 wordChars 方法的更多信息,您可以查看#wordChars(int, int)

【讨论】:

  • Integer是int基元类型的封装类,用于存储每个单词的重复次数。
  • 先生,当我尝试使用原始 int 数据类型进行求解时,因此在运行时编译器会显示 classcasteException .. 所以 int 数据类型不可能
  • 你不能使用 int 代替 Integer 作为 hashmap。如果您想使用 int 而不是 Integer 作为“val”变量,您应该按照以下方式进行 int val = 1; if(map.get(s) != null)) val = map.get(s) + 1; map.put(s, val); 但使用此解决方案没有优势,因为存在 int 值的自动装箱。此外,请注意,您不能比较 int 原始类型和 null。
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2021-02-28
  • 2011-02-22
相关资源
最近更新 更多