为了账号安全,请及时绑定邮箱和手机立即绑定

使用 StreamTokenizer () 、 HashMap() 、 HashSet()

使用 StreamTokenizer () 、 HashMap() 、 HashSet()

梦里花落0921 2022-07-27 09:28:34
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字:销售人员 = 1字:* = 1字:这= 1字:+ = 2字:java = 1字:世界 = 1单词:你好 = 1文件总字数:11**我无法找到为什么这将 c++ 显示为单独的单词。我想在输出中将 c++ 组合为一个单词
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

你可以这样做


    // 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 和迭代器更新了您的代码。此外,您用于 StreamTokenizer 的构造函数已被弃用。使用 map 和 set 是没有用的,因为您可以使用 .keySet() 方法迭代 map 的键集。该映射现在从 String(单词)变为 Integer(单词数)。


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


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


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信