A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© happy42779 中级黑马   /  2014-9-2 23:22  /  1547 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写一个Java应用程序,使用RandomAccessFile流统计Hello.txt中的单词,要求如下:
(1)计算全文中共出现了多少个单词(重复的单词只计算一次);
(2)统计出有多少个单词只出现了一次;
(3)统计并显示出每个单词出现的频率,并将这些单词按出现频率高低顺序显示在一个TextArea中。

求助,自己试过了,思路也知道,只是实现的时候除了些问题,半天找不到方法解决。劳烦希望大虾们留下代码,因为我想从中学习更多的思路。如果从中看到与我思路相关的问题可以再向你们请教。

6 个回复

倒序浏览
  1. import java.util.*;
  2. import java.io.*;
  3. import java.lang.*;
  4. import java.awt.Frame;
  5. import java.awt.TextArea;

  6. class CountPara extends Frame
  7. {
  8.         CountPara(RandomAccessFile randomR)
  9.         {
  10.                 Map<String,Integer> map = new HashMap<String, Integer>();
  11.                
  12.                 map = countWords(map,randomR);
  13.        
  14.                 countOnce(map);
  15.        

  16.                 countFreq(map);
  17.         }
  18.        
  19.         public Map countWords(Map<String,Integer> map, RandomAccessFile raf)
  20.         {
  21.                 byte[] b = new byte[1];
  22.                 char[] temp = new char[1];
  23.                 StringBuffer sb = new StringBuffer();
  24.                 String s;
  25.                 char c;
  26.                
  27.                 try
  28.                 {
  29.                         while(raf.getFilePointer()<raf.length())
  30.                         {
  31.                        
  32.                                
  33.                                 raf.readFully(b);
  34.                                 s = new String(b);
  35.                                
  36.                                 temp = s.toCharArray();
  37.                                
  38.                                 c = temp[0];
  39.                                
  40.                                
  41.                                 //从非空格字符开始数算       
  42.                                 while(Character.isLetter(c))
  43.                                 {
  44.                                         sb.append(new String(temp));
  45.                                        
  46.                                         raf.readFully(b);
  47.                                         s = new String(b);       
  48.                                         temp = s.toCharArray();
  49.                                         c = temp[0];
  50.                                        
  51.                                 }
  52.                        
  53.                                
  54.                                
  55.                                 if(map.containsKey(sb.toString()))
  56.                                 {
  57.                                         map.put(sb.toString(), 1+map.get(sb.toString()));
  58.                                 }
  59.                                        
  60.                                 else if(sb.length()> 0)
  61.                                 map.put(sb.toString(), 1);
  62.                                
  63.                                 sb.delete(0,sb.length());
  64.                                
  65.                                
  66.                         }
  67.                        
  68.                         raf.close();
  69.                 }
  70.                
  71.                
  72.                 catch (EOFException e)
  73.                 {
  74.                         e.printStackTrace();
  75.                 }
  76.                 catch (IOException e)
  77.                 {
  78.                         e.printStackTrace();
  79.                 }
  80.                
  81.                 System.out.println("全文共出现"+ map.size() +" 个单词。");
  82.                
  83.                 return map;
  84.                
  85.         }
  86.        
  87.         public void countOnce(Map<String, Integer> map)
  88.         {
  89.                 Set<String> keySet = map.keySet();
  90.                
  91.                 Iterator<String> it = keySet.iterator();
  92.                
  93.                 System.out.print("出现一次的单词有: ");
  94.                
  95.                 int i = 1;
  96.                 while(it.hasNext())
  97.                 {
  98.                         String s = it.next();
  99.                        
  100.                        
  101.                        
  102.                         if(map.get(s)==1)
  103.                         {
  104.                                 System.out.print(i+"."+s+" ");
  105.                                 i++;
  106.                         }
  107.                 }
  108.                  
  109.         }
  110.        
  111.        
  112.         public void countFreq(Map<String,Integer> map)
  113.         {
  114.                 //将map.entry转换成arraylist
  115.                 List<Map.Entry<String,Integer>> list = new ArrayList<
  116.                 Map.Entry<String,Integer>>(map.entrySet());
  117.                
  118.                
  119.                 Collections.sort(list,new Comparator<Map.Entry<String,Integer>>()
  120.                 {
  121.                         public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2)
  122.                         {
  123.                                 return o1.getValue().compareTo(o2.getValue());
  124.                         }
  125.                        
  126.                 });
  127.                
  128.                
  129.                
  130.                 Frame f = new Frame();
  131.                
  132.                 TextArea text = new TextArea();
  133.                 f.setSize(400,300);
  134.                 f.setLocation(300,200);

  135.                 text.setRows(50);
  136.                 text.setColumns(5);
  137.                
  138.                 f.add(text);

  139.                 f.setVisible(true);

  140.                 for(Map.Entry<String,Integer> mapping:list)
  141.                 text.append(mapping.getKey()+":"+mapping.getValue()+" ");
  142.                
  143.         }
  144.        
  145.        
  146. }       

  147. public class Three
  148. {
  149.        
  150.         public static void main (String[] args)
  151.         {
  152.                 System.out.println("hallelujah!");
  153.                 System.out.println();
  154.                
  155.                 RandomAccessFile raf = null;
  156.                
  157.                
  158.                 try
  159.                 {
  160.                         raf = new RandomAccessFile("hello.txt","r");
  161.                        
  162.                         CountPara ctp = new CountPara(raf);
  163.                        
  164.                         raf.close();
  165.                 }
  166.                
  167.                
  168.                 catch(EOFException e)
  169.                 {
  170.                         e.printStackTrace();
  171.                 }
  172.        
  173.                 catch(IOException e)
  174.                 {
  175.                         e.printStackTrace();
  176.                 }
  177.                
  178.                
  179.         }
  180. }
复制代码



自己给自己回复吧。 度了好久才一点点度出来。虽然实现了,但是里面的东西还的多消化消化。 望各位大虾予以指教,在个方面要如何改进。:lol

评分

参与人数 1技术分 +1 收起 理由
追求卓越 + 1

查看全部评分

回复 使用道具 举报
就1个想法和你不一样   我是读取文件里的单词到StringBuilder容器里  然后转成String  再用正则来获取符合单词格式的字符串, 然后把获得的字符串来做其他运算.   其他都差不多一样的
  1. // 创建随机文件流,读取文件,返回读到的数据
  2.         public static String readFile() throws Exception {
  3.                 RandomAccessFile raf = new RandomAccessFile("d:/hello.txt", "rw");
  4.                 // 创建一个容器来存储读到的数据
  5.                 StringBuilder sb = new StringBuilder();
  6.                 String line = null;
  7.                 while ((line = raf.readLine()) != null) {
  8.                         sb.append(line);
  9.                         sb.append(" ");
  10.                 }
  11.                 raf.close();
  12.                 return sb.toString();
  13.         }

  14.         // 将传入的数据进行判断
  15.         private static Map<String, Integer> splitLine(String line) {
  16.                 String regex = "\\b[A-Za-z]+\\b";
  17.                 Pattern p = Pattern.compile(regex);
  18.                 Matcher matcher = p.matcher(line);
  19.                 // 创建map集合 将单词传入
  20.                 Map<String, Integer> map = new TreeMap<String, Integer>();
  21.                 while (matcher.find()) {
  22.                         String key = matcher.group();
  23.                         if (map.containsKey(key)) {
  24.                                 int num = map.get(key);
  25.                                 map.put(key, num + 1);
  26.                         } else {
  27.                                 map.put(key, 1);
  28.                         }
  29.                 }
  30.                 ta.append("共出现的单词个数有:" + map.size() + "\r\n");
  31.                 // 获取Set集合
  32.                 Set<Map.Entry<String, Integer>> set = map.entrySet();
  33.                 Iterator<Map.Entry<String, Integer>> it = set.iterator();
  34.                 while (it.hasNext()) {
  35.                         Entry<String, Integer> str = it.next();
  36.                         if (str.getValue() == 1) {
  37.                                 ta.append("单词:" + str.getKey() + ":只出现了一次\r\n");
  38.                         }
  39.                 }
  40.                 return map;
  41.         }
复制代码
回复 使用道具 举报
楼主最好说明一下何为“单词”?不带空格的字符串就是单词?don't I'm 这种算一个单词吗?单词之间用一个或多个空格隔开?
回复 使用道具 举报
fantacyleo 发表于 2014-9-7 00:13
楼主最好说明一下何为“单词”?不带空格的字符串就是单词?don't I'm 这种算一个单词吗?单词之间用一个或 ...

自然是空格 正常想法就是隔开了就算 否则要载入词典才能判断单词?
回复 使用道具 举报
happy42779 发表于 2014-9-6 09:05
自己给自己回复吧。 度了好久才一点点度出来。虽然实现了,但是里面的东西还的多消化消化。 望各位大虾 ...

能不能加点注释啊?读起来太费劲了
回复 使用道具 举报
︶ㄣ冰衅ヅ 发表于 2014-9-7 00:04
就1个想法和你不一样   我是读取文件里的单词到StringBuilder容器里  然后转成String  再用正则来获取符合 ...

好的。多谢指教。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马