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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我叫MT 于 2014-3-28 18:16 编辑

如题:
  1. 比如:我:23次
  2.         M:11次
  3.         ,:34次
  4.         ::5次
复制代码

汉字,符号都算具体要用到哪种类来操作?那又如何去判断文件中该字符出现了多少次?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

7 个回复

倒序浏览
我个人觉得可以使此文件与一个流进行关联,每次读取一行,然后在使用正则进行匹配,匹配同时进行累加。你觉得这样可以吗?
回复 使用道具 举报
  1. import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;

  6. public class IOTest {
  7.         public static void main(String[] args) {
  8.                 BufferedReader br = null;
  9.                 FileReader fr = null;
  10.                 try {
  11.                         fr = new FileReader("D:\\ClassLoaderTest.java");
  12.                         br = new BufferedReader(fr);
  13.                         Map<Character,Integer> map = new HashMap<Character,Integer>();       
  14.                         String str = null;
  15.                         while((str=br.readLine())!=null) {
  16.                                 char[] cbuf = str.toCharArray();
  17.                                 for(int i=0; i<cbuf.length; i++) {
  18.                                         Character c = cbuf[i];
  19.                                         if(map.containsKey(c)) {
  20.                                                 map.put(c, map.get(c)+1);
  21.                                         } else {
  22.                                                 map.put(c,1);
  23.                                         }
  24.                                 }
  25.                         }
  26.                         //输出结果
  27.                         System.out.println(map);
  28.                 }
  29.                 //捕获异常
  30.                 catch (IOException e) {
  31.                         e.printStackTrace();
  32.                 }
  33.                 //释放资源
  34.                 finally {
  35.                         if(null!=fr)
  36.                         {
  37.                                 try {
  38.                                         fr.close();
  39.                                 } catch (IOException e) {
  40.                                         e.printStackTrace();
  41.                                 }
  42.                         }
  43.                         if(null!=br)
  44.                         {
  45.                                 try {
  46.                                         br.close();
  47.                                 } catch (IOException e) {
  48.                                         e.printStackTrace();
  49.                                 }
  50.                         }
  51.                 }
  52.         }
  53. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
和楼上的差不多了
  1. BufferedReader bufr=new BufferedReader(new FileReader("D:\\a\\a.txt"));
  2.                 char ch[]=new char[1024];
  3.                 String line=null;
  4.                
  5.                 Map<Character,Integer> map=new HashMap<Character,Integer>();
  6.                
  7.                 while((line=bufr.readLine())!=null){
  8.                         ch=line.toCharArray();
  9.                         int num;
  10.                         for(int i=0;i<ch.length;i++){
  11.                                 if(!map.containsKey(ch[i]))
  12.                                 {
  13.                                         map.put(ch[i], 1);
  14.                                         continue;
  15.                                 }
  16.                                 num=map.get(ch[i]);
  17.                                 num++;
  18.                                 map.put(ch[i], num);
  19.                         }
  20.                        
  21.                 }
  22.                
  23.                 Set<Map.Entry<Character,Integer>> entrySet=map.entrySet();
  24.                
  25.                 for(Map.Entry<Character,Integer> en:entrySet)
  26.                 {
  27.                         System.out.println(en.getKey()+"..."+en.getValue());
  28.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 熊志伟 于 2014-3-25 23:13 编辑

我的思路大致如下,应该还可以改进的:1,定义一个StringBuilder来接收取出的字符流 2,将字符串转换为字符数组 toCharArray()   3,将字符串数组的元素存入进一个map<Character,Integer>集合中 4,利用map集合的 entrySet()方法取出键值set关系视图后进行遍历,再利用Map.Entry<Character, Integer>的特有方法:getKey()和getValue()输出结果

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
首先读文件到缓冲区 然后挨个扫~
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Scanner;
/**
*
*/
/**
* @author Leslie
*
*/
public class Test{

public static void main(String[] args) throws FileNotFoundException {
  // TODO Auto-generated method stub
  /*Scanner scanner = new Scanner(System.in);//输入字符串
  String string = scanner.next();*/
  StringBuffer buffer = new StringBuffer();
   
  int count=0;//对于首次加入到hashmap的值初始化
   
  FileReader fileReader = new FileReader(new File("exercise.txt"));
  BufferedReader bufferedReader = new BufferedReader(fileReader);
  String tempString = null;
  try {
   while((tempString=bufferedReader.readLine())!=null){
    buffer.append(tempString);
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   
  HashMap<Character, Integer> map = new HashMap<Character, Integer>();//HashMap 不允许重复插入元素 允许为空值
  for(int i=0;i<buffer.length();i++){
   if(map.containsKey(buffer.charAt(i))){ //若已经有该元素则将该元素对应的键值加1
     
    count=count+1;
    int num=map.get(buffer.charAt(i))+1;
    map.put(buffer.charAt(i), num); //将修改后的键值对象和键值插入到map中
     
   }else { //若
    count=1;
    map.put(buffer.charAt(i), count);
   }
   
  }
  System.out.println(map.toString()); //将结果输出 等号前面是元素,后面是出现次数
}

}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
  1. import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.util.HashMap;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;

  7. public class Test{
  8.         public static void main(String[] args) throws Exception {
  9.                 BufferedReader bufr = new BufferedReader(new FileReader("C:\\a.txt"));
  10.                 Map<Character,Integer> map = new HashMap<Character,Integer>();
  11.                 String line = null;
  12.                 while((line=bufr.readLine())!=null){
  13.                         char[] cha = line.toCharArray();
  14.                        
  15.                         for(int i=0; i<cha.length; i++) {
  16.                                 if(!(map.containsKey(cha[i]))){
  17.                                         map.put(cha[i],1);
  18.                                 }else{
  19.                                         map.put(cha[i],map.get(cha[i])+1);
  20.                                 }
  21.                         }
  22.                 }
  23.                 //对集合进行遍历输出
  24.                 Set<Character> ketSet  = map.keySet();
  25.                 Iterator<Character> ite  = ketSet.iterator();
  26.                 while(ite.hasNext()){
  27.                         System.out.println("字符:\""+ite.next()+"\"出现了:"+map.get(ite)+"次");
  28.                 }
  29.         }
  30. }
复制代码


为什么我读取到的键所对应的值全是null?哪里出问题了,你试着运行一下我的再指点一下出问题的原因

字符:"大"出现了:null次
字符:"要"出现了:null次
字符:"原"出现了:null次
字符:"计"出现了:null次
字符:"况"出现了:null次
字符:"黑"出现了:null次
字符:"训"出现了:null次
字符:"        "出现了:null次
字符:"造"出现了:null次
字符:"情"出现了:null次
字符:"太"出现了:null次
字符:"素"出现了:null次
字符:"失"出现了:null次
字符:"设"出现了:null次
字符:"拷"出现了:null次
字符:"历"出现了:null次
字符:"黄"出现了:null次
字符:"当"出现了:null次
字符:"编"出现了:null次
字符:"""出现了:null次
字符:"去"出现了:null次
字符:" "出现了:null次
字符:"处"出现了:null次
字符:"&"出现了:null次
.........
.........

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
水蓝 中级黑马 2014-3-26 11:27:08
8#
第28行,迭代器做为key值,到map里面获取value是错的。迭代器,本身不是key。它只是用来遍历的工具。
while循环应该这么改:
  1. while(ite.hasNext()){
  2.                                 char ch = ite.next();
  3.                         System.out.println("字符:\""+ch+"\"出现了:"+map.get(ch)+"次");
  4.                 }
复制代码


顺便补充一下:
如果用只是遍历获取值,用for-each更直观一点。
你在迭代之后,相同时获取key和value对应值。直接获取map的EntrySet会比获取keySet更好一些。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马