2015-10-20 2 views
0
import java.io.*; 
import java.util.*; 

public class ListSetMap2 
{ 
    public static void main(String[] args) 
    { 
     Map<String, Integer> my_collection = new HashMap<String, Integer>(); 
     Scanner keyboard = new Scanner(System.in); 

     System.out.println("Enter a file name"); 
     String filenameString = keyboard.nextLine(); 
     File filename = new File(filenameString); 
     int word_position = 1; 
     int word_num = 1; 

     try 
     { 
      Scanner data_store = new Scanner(filename); 
      System.out.println("Opening " + filenameString); 
      while(data_store.hasNext()) 
      { 
       String word = data_store.next(); 
       if(word.length() > 5) 
       { 
        if(my_collection.containsKey(word)) 
        { 
         my_collection.get(my_collection.containsKey(word)); 
         Integer p = (Integer) my_collection.get(word_num++); 
         my_collection.put(word, p); 
        } 
        else 
        { 
         Integer i = (Integer) my_collection.get(word_num); 
         my_collection.put(word, i); 
        } 
       } 
      } 
     } 
     catch (FileNotFoundException e) 
     { 
      System.out.println("Nope!"); 
     } 
    } 
} 

Я пытаюсь написать программу, в которую он вставляет/сканирует файл, записывает слова в коллекции HashMap и подсчитывает время, когда это слово встречается в документе, только с надписью Учитывается 5 символов.Программа подсчета слов с использованием HashMaps

Это немного беспорядок посередине, но я столкнулся с проблемами, связанными с тем, как подсчитывать количество раз, когда это слово происходит, и ведение индивидуального подсчета для каждого слова. Я уверен, что здесь есть простое решение, и я просто пропустил его. Пожалуйста помоги!

+0

Что конкретный вопрос? Каждая хэш-запись является парой ключ/значение, ключ - это слово, значение - это счетчик. –

+0

Если это не домашнее задание, то ['Multiset'] Guava (https://github.com/google/guava/wiki/NewCollectionTypesExplained) является самым простым решением. –

ответ

3

Вашей логики установки частоты слова неправильно. Вот простой подход, который должен работать для вас:

// if the word is already present in the hashmap 
    if (my_collection.containsKey(word)) { 
     // just increment the current frequency of the word 
     // this overrides the existing frequency 
     my_collection.put(word, my_collection.get(word) + 1); 
    } else { 
     // since the word is not there just put it with a frequency 1 
     my_collection.put(word, 1); 
    } 
0

(только давая намеки, так как это, кажется, домашнее задание.) my_collection есть (правильно) а HashMap, который отображает String ключи от Integer значений; в вашей ситуации ключ должен быть словом, а соответствующее значение должно быть числом раз, когда вы видели это слово (частота). Каждый раз, когда вы вызываете my_collection.get(x), параметр x должен быть String, а именно слово, частота которого вы хотите знать (к сожалению, HashMap не применяет это действие). Каждый раз, когда вы звоните my_collection.put(x, y), x должен быть String, а y должен быть Integer или int, а именно, частота для этого слова.

Учитывая это, расскажите о том, что вы используете в качестве параметров, и о последовательности, в которой вам нужно совершать вызовы и как вам нужно управлять значениями. Например, если вы уже определили, что my_collection не содержит слова, имеет ли смысл задавать my_collection для частоты слова? Если он содержит слово, как вам нужно изменить частоту, прежде чем вводить новое значение в my_collection?

(Также, пожалуйста, выберите более описательное имя для my_collection, например frequencies.)

0

Попробуйте этот путь -

while(data_store.hasNext()) { 

       String word = data_store.next(); 

        if(word.length() > 5){ 

        if(my_collection.get(word)==null) my_collection.put(1); 
        else{ 
         my_collection.put(my_collection.get(word)+1); 
        } 

       } 
}