Вычисление частоты слов с помощью StreamTokenizer (), HashMap (), HashSet ().в Java Core - PullRequest
0 голосов
/ 10 марта 2019
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

И вывод этого кода:

** Частота слов:

WORD: # = 1

WORD: @ = 1

WORD: c = 1

WORD: salesforce = 1

WORD: * = 1

WORD: Hii = 1

WORD: + = 2

WORD: java = 1

WORD: World = 1

WORD: Hello = 1

Всего словВ файлах: 11 **

, где я не могу найти, почему это показывает C ++ как отдельные слова.Я хочу объединить c ++ как одно слово как в выводе

1 Ответ

1 голос
/ 10 марта 2019

Вы можете сделать это следующим образом

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

Обратите внимание, что я обновил ваш код, используя Generics вместо исходной версии HashMap и Iterator.Более того, конструктор, который вы использовали для StreamTokenizer, устарел.Использование и map, и set было бесполезно, потому что вы можете перебирать набор ключей карты, используя метод .keySet ().Карта теперь переходит от String (слово) к Integer (количество слов).

В любом случае, что касается сделанного вами примера, я думаю, что простой метод разбиения был бы более подходящим.

Для получения дополнительной информации о методе wordChars StreamTokenizer вы можете взглянуть на # wordChars (int, int)

...