黑马程序员技术交流社区
标题:
如何把一个txt文件中每个字符出现的次数统计出来?
[打印本页]
作者:
我叫MT
时间:
2014-3-25 21:47
标题:
如何把一个txt文件中每个字符出现的次数统计出来?
本帖最后由 我叫MT 于 2014-3-28 18:16 编辑
如题:
比如:我:23次
M:11次
,:34次
::5次
复制代码
汉字,符号都算具体要用到哪种类来操作?那又如何去判断文件中该字符出现了多少次?
作者:
无道
时间:
2014-3-25 22:27
我个人觉得可以使此文件与一个流进行关联,每次读取一行,然后在使用正则进行匹配,匹配同时进行累加。你觉得这样可以吗?
作者:
水蓝
时间:
2014-3-25 22:52
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class IOTest {
public static void main(String[] args) {
BufferedReader br = null;
FileReader fr = null;
try {
fr = new FileReader("D:\\ClassLoaderTest.java");
br = new BufferedReader(fr);
Map<Character,Integer> map = new HashMap<Character,Integer>();
String str = null;
while((str=br.readLine())!=null) {
char[] cbuf = str.toCharArray();
for(int i=0; i<cbuf.length; i++) {
Character c = cbuf[i];
if(map.containsKey(c)) {
map.put(c, map.get(c)+1);
} else {
map.put(c,1);
}
}
}
//输出结果
System.out.println(map);
}
//捕获异常
catch (IOException e) {
e.printStackTrace();
}
//释放资源
finally {
if(null!=fr)
{
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null!=br)
{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
复制代码
作者:
我感觉优势很大
时间:
2014-3-25 22:55
和楼上的差不多了
BufferedReader bufr=new BufferedReader(new FileReader("D:\\a\\a.txt"));
char ch[]=new char[1024];
String line=null;
Map<Character,Integer> map=new HashMap<Character,Integer>();
while((line=bufr.readLine())!=null){
ch=line.toCharArray();
int num;
for(int i=0;i<ch.length;i++){
if(!map.containsKey(ch[i]))
{
map.put(ch[i], 1);
continue;
}
num=map.get(ch[i]);
num++;
map.put(ch[i], num);
}
}
Set<Map.Entry<Character,Integer>> entrySet=map.entrySet();
for(Map.Entry<Character,Integer> en:entrySet)
{
System.out.println(en.getKey()+"..."+en.getValue());
}
复制代码
作者:
熊志伟
时间:
2014-3-25 23:12
本帖最后由 熊志伟 于 2014-3-25 23:13 编辑
我的思路大致如下,应该还可以改进的:1,定义一个StringBuilder来接收取出的字符流 2,将字符串转换为字符数组 toCharArray() 3,将字符串数组的元素存入进一个map<Character,Integer>集合中 4,利用map集合的 entrySet()方法取出键值set关系视图后进行遍历,再利用Map.Entry<Character, Integer>的特有方法:getKey()和getValue()输出结果
作者:
zhuyunfei00000
时间:
2014-3-26 00:03
首先读文件到缓冲区 然后挨个扫~
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()); //将结果输出 等号前面是元素,后面是出现次数
}
}
作者:
我叫MT
时间:
2014-3-26 10:20
水蓝 发表于 2014-3-25 22:52
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test{
public static void main(String[] args) throws Exception {
BufferedReader bufr = new BufferedReader(new FileReader("C:\\a.txt"));
Map<Character,Integer> map = new HashMap<Character,Integer>();
String line = null;
while((line=bufr.readLine())!=null){
char[] cha = line.toCharArray();
for(int i=0; i<cha.length; i++) {
if(!(map.containsKey(cha[i]))){
map.put(cha[i],1);
}else{
map.put(cha[i],map.get(cha[i])+1);
}
}
}
//对集合进行遍历输出
Set<Character> ketSet = map.keySet();
Iterator<Character> ite = ketSet.iterator();
while(ite.hasNext()){
System.out.println("字符:\""+ite.next()+"\"出现了:"+map.get(ite)+"次");
}
}
}
复制代码
为什么我读取到的键所对应的值全是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次
.........
.........
作者:
水蓝
时间:
2014-3-26 11:27
第28行,迭代器做为key值,到map里面获取value是错的。迭代器,本身不是key。它只是用来遍历的工具。
while循环应该这么改:
while(ite.hasNext()){
char ch = ite.next();
System.out.println("字符:\""+ch+"\"出现了:"+map.get(ch)+"次");
}
复制代码
顺便补充一下:
如果用只是遍历获取值,用for-each更直观一点。
你在迭代之后,相同时获取key和value对应值。直接获取map的EntrySet会比获取keySet更好一些。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2