黑马程序员技术交流社区
标题:
一道面试题
[打印本页]
作者:
wudigod12
时间:
2015-7-23 21:37
标题:
一道面试题
看到别人帖子里的一道面试题, 挺有趣的, 自己写出来和大家交流下.
D盘中有一文件a.txt, 内容有字母和数字, 用户输入密码"heima"可读取文件内容, 统计出每个字母出现的次数,按照"a:1个 b:2个"的格式打印出来.
package test;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class test6 {
public static void main(String[] args) throws IOException{
//获取用户输入的密码
Scanner scan = new Scanner(System.in);
String str = null;
while((str = scan.nextLine()) != null){
//密码正确则读取文件
if("heima".equals(str)){
readFile();
break;
}else{
System.out.println("请重新输入密码");
}
}
}
public static void readFile() throws IOException{
TreeMap<Character,Integer> m = new TreeMap<Character,Integer>();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\a.txt"));
int by = 0;
while((by=bis.read()) != -1){
//判断是否为字母,排除数字和符号
if((by >= 'a' && by <='z') || (by >= 'A' && by <= 'Z')){
//System.out.print((char)by);
//如果Map中没有这个键,则初始化这个键的值为1
if(!m.containsKey((char)by)){
m.put((char)by, 1);
}else{
//如果存在,则值加1
m.put((char)by, m.get((char)by) + 1);
}
}
}
//按格式输出统计数据.
Set<Entry<Character, Integer>> set = m.entrySet();
Iterator<Entry<Character, Integer>> it = set.iterator();
while(it.hasNext()){
Entry<Character,Integer> e = it.next();
System.out.print(e.getKey() + ":" + e.getValue() + "个\t");
}
}
}
作者:
三土
时间:
2015-7-23 22:53
思路很巧妙 !
作者:
小p
时间:
2015-7-23 23:11
现在看起还是有点难度
作者:
xiaoxinxin003
时间:
2015-7-23 23:37
我这里也有一个类似的 自己写的
package com.itheima;
import java.io.*;
import java.util.*;
/*7、 统计一个文本文件中字符出现的次数,结果存入另外的一个文本文件中。例如:
a: 21 次
b: 15 次
c: 15 次
把: 7 次
当: 9 次
前: 3 次
,:30 次*/
public class Test7 {
private static Integer value;
public static void main(String[] args) {
BufferedReader br = null;
FileWriter fw = null;
try {//关联文件
br = new BufferedReader(new FileReader("e:\\a.txt"));
fw = new FileWriter("e:\\b.txt");
//字符与次数以键值对的形式存放到集合中,使用TreeMap集合
TreeMap<Character,Integer> hm = new TreeMap<Character,Integer>();
value = null;
int count = 0;
String str = null;
//每次读取一行
while((str = br.readLine())!=null)
{
//System.out.println(str);
for(int i=0;i<str.length();i++)
{//此过程类似于统计字符串中字母出现次数了,不再赘述
value = hm.get(str.charAt(i));
if(value != null)
count = value;
count++;
hm.put(str.charAt(i), count);
count = 0;
}
//System.out.println(hm.size());
}
//System.out.println(hm.size());
StringBuilder sb = new StringBuilder();//存放特定格式数据
//定义set集合存放键值对映射关系,可以迭代
Set<Map.Entry<Character, Integer>> entrySet = hm.entrySet();
Iterator<Map.Entry<Character, Integer>>it = entrySet.iterator();
while(it.hasNext())
{//获取每一对映射关系,取出相应的键值对。
Map.Entry<Character, Integer>me = it.next();
Character chs = me.getKey();//获取键和值
Integer counts = me.getValue();
sb.append(chs+": "+counts+"次 "+"\r\n");//存储
}
fw.write(sb.toString()+"\r\n");//将容器中的数据写入到文件
fw.flush();//刷新流中的数据到文件
System.out.println(sb.toString()+"\r\n");
} catch (Exception e) {
// TODO: handle exception
e.getStackTrace();
}
}
}
复制代码
作者:
mortonwyj
时间:
2015-7-23 23:45
明天做一下哈哈
作者:
wanghua1
时间:
2015-7-23 23:51
值得一看啊 ,这种面试题可以多发点
作者:
路遥知马力
时间:
2015-7-23 23:54
这个题综合性好强!
作者:
T-l-H、小生
时间:
2015-7-24 00:12
值得看看
作者:
wudigod12
时间:
2015-7-24 00:20
xiaoxinxin003 发表于 2015-7-23 23:37
我这里也有一个类似的 自己写的
:lol我们想到一起去了. 以后多多交流~
作者:
田利阳
时间:
2015-7-24 00:31
谢谢分享
作者:
蔡锐
时间:
2015-7-24 08:20
得好好的巩固所学的知识才能做出来呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2