2013-12-12 9 views
0

и, пожалуйста, извините мое невежество, я несколько раз озадачиваю это.Java - Hashmapping текстовый файл

У меня есть большой файл .txt, содержащий в основном буквы. Мне нужно создать HashMaps для хранения длины слова, символов Word и Word count ... Мне нужно распечатать самое длинное слово, которое произошло более трех раз, и показать, сколько раз оно произошло. Im думая что-то подобное

private void readWords(){ 
    BufferedReader in = new BufferedReader(new FileReader("text.txt")); 

Map<Integer, Map<String, Integer>> 
} 

Проблема в том, что я не знаю, как сохранить в HashMap, может кто-нибудь помочь, пожалуйста?

Спасибо!

+2

Вы прошли через [ 'HashMap' Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html)? –

+0

Можете ли вы быть более ясными о «я не знаю, как сэкономить на HashMap»? –

+0

Вам нужно будет каким-то образом проанализировать файл. Возможно, поможет [Сканер] (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html)? –

ответ

0
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class HashMapExample { 

static String fileName = "text.txt"; 
private static Scanner input; 

public static void main(String[] args) throws FileNotFoundException { 

    input = new Scanner(new File(fileName)); 

    Map<String, Integer> map = new HashMap<String, Integer>(); 

    while (input.hasNext()) { 
     String word = input.next(); 
     if (map.containsKey(word)) { 
      int temp = map.get(word) + 1; 
      map.put(word, temp); 
     } else { 
      map.put(word, 1); 
     } 
    } 

    System.out.println("printing longest word(s) with word count < 3"); 
    System.out.println(""); 

    // iterate through the key set and display word, word length and values 
    System.out.printf("%-25s\t%-25s\t%s\n", "Word", "Word Length", "Count"); 

    String longest = getLongest(map); 

    int valueOfLongest = 0; 
    if (!longest.equals("")) { 
     valueOfLongest = longest.length(); 
     System.out.printf("%-25s\t%-25s\t%s\n", longest, longest.length(), map.get(longest)); 
     map.remove(longest); 
    } 


    boolean isAllRemoved = false; 
    while (!isAllRemoved) { 
     isAllRemoved = false; 
     longest = getLongest(map); 
     if (!longest.equals("") && longest.length() == valueOfLongest){ 
      System.out.printf("%-25s\t%-25s\t%s\n", longest, longest.length(), map.get(longest)); 
      map.remove(longest); 
     } else 
      isAllRemoved = true; 
    } 

    System.out.println(""); 
    System.out.println("printing next longest word(s) with word count > = 3"); 
    System.out.println(""); 

    // iterate through the key set and display word, word length and values 
    System.out.printf("%-25s\t%-25s\t%s\n", "Word", "Word Length", "Count"); 

    String nextLongest = getNextLongest(map, valueOfLongest); 

    int valueOfNextLongest = 0; 
    if (!longest.equals("")) { 
     valueOfNextLongest = nextLongest.length(); 
     System.out.printf("%-25s\t%-25s\t%s\n", nextLongest, nextLongest.length(), map.get(nextLongest)); 
     map.remove(nextLongest); 
    } 

    boolean isNextLongest = false; 
    while (!isNextLongest) { 
     isNextLongest = true; 
     nextLongest = getNextLongest(map, valueOfLongest); 
     if (!(nextLongest.equals("")) && nextLongest.length() == valueOfNextLongest) { 
      System.out.printf("%-25s\t%-25s\t%s\n", nextLongest, nextLongest.length(), map.get(nextLongest)); 
      map.remove(nextLongest); 
      isNextLongest = false; 
     } 

    } 

} 

public static String getLongest(Map<String, Integer> map) { 
    String longest = ""; 
    for (Map.Entry<String, Integer> entry : map.entrySet()) { 
     String key = (String) entry.getKey(); 
     if (longest.length() < key.length() && map.get(key) < 3) { 
      longest = key; 
     } 

    } 

    return longest; 
} 

public static String getNextLongest(Map<String, Integer> map, 
     int valueOfLongest) { 
    String nextLongest = ""; 
    for (Map.Entry<String, Integer> entry : map.entrySet()) { 
     String key = (String) entry.getKey(); 
     if (valueOfLongest > key.length() && nextLongest.length() < key.length() && map.get(key) >= 3) { 
      nextLongest = key; 
     } 

    } 

    return nextLongest; 
} 
} 
+0

Если самое длинное слово произошло <3 раза, оно не будет напечатано, но будет напечатано следующее длинное слово, которое встречается> = 3. Кстати, этот код блестящий! Он нуждается в некоторой настройке - любые небуквенные символы не должны рассматриваться в длине слова – user3093590

0
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashSet; 
import java.util.Set; 

import com.google.common.collect.HashMultiset; 
import com.google.common.collect.Multiset; 

public class CountWord { 
    public static void main(String args[]) throws IOException { 
     FileReader fr = new FileReader("c:/a.txt"); 
     BufferedReader br = new BufferedReader(fr); 

     // init the longest size 0 
     int longestSize = 0; 
     String s = null; 
     // may be some word have the same length 
     Set<String> finalAnswerSet = new HashSet<String>(); 
     Multiset<String> everyWordSet = HashMultiset.create(); 
     while (br != null && (s = br.readLine()) != null) { 
      // put every word into the everyWordSet 
      everyWordSet.add(s); 
      // we care about the word appear 3+ times 
      if (everyWordSet.count(s) > 3) { 
       if (s.length() > longestSize) { 
        //if s'length is the longest,clear the finalAnswerSet and put s into it 
        longestSize = s.length(); 
        finalAnswerSet.clear(); 
        finalAnswerSet.add(s); 
       } else if (s.length() == longestSize) { 
        // finalAnswerSet may contains multi values 
        finalAnswerSet.add(s); 
       } 
      } 
     } 
     // and now we have the longestSize,and finalAnswerSet contains the answers,let's check it 
     System.out.println("The longest size is:" + longestSize); 
     for (String answer : finalAnswerSet) { 
      System.out.println("The word is :" + answer); 
      System.out.println("The word appears time is:" + everyWordSet.count(answer)); 
     } 
     //don't forget to close the resource 
     br.close(); 
     fr.close(); 
    } 
} 
+0

У вас есть точка вправо, но на данный момент программа включает в себя ВСЕ символы, которых она не должна. ! ») (/ #?% =) ¤ и т. Д., А также ничего, кроме LETTERS. – user3093590

+0

Простым решением является то, что вы ставите регулярное выражение в начале Big WHILE, вы можете фильтровать любые символы, которые вы хотите, но производительность будет неделя. Или вы можете использовать apache WordUtils, метод isAlphanumeric будет jundge, если слово является альфа, числовым или нет. Но! Правило фильтра зависит от вас самих, так же как и формат файла, код [br.readLine ] это просто предположение. Я думаю, что вы можете решить это, удачи! – xy1m

Смежные вопросы