黑马程序员技术交流社区
标题:
论坛上的一道入学测试题
[打印本页]
作者:
nxp1986
时间:
2014-10-27 22:28
标题:
论坛上的一道入学测试题
在论坛上找了许多的入学测试题,其中一道怎么做都做不来了,太打击自信心了,有大神给点经验没
把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出,
例如:
a: 21 次
b: 15 次
c: 15 次
把: 7 次
当: 9 次
前: 3 次
,:30 次
我把文件输出然后存储到缓冲里面StringBuffer里面,在转成字符数组,使用集合,但是map.get(char[i])都是null;
如果进行判断的话,就会导致打印出来的结果很明显是不一样的
作者:
唐王潮
时间:
2014-10-27 22:34
这道题我自己也研究过,贴上我的代码,你可以参考一下
package reviewCode2;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* 把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出
*@author
*/
public class IOTest {
public static void main(String[] args) throws IOException {
File socfile = new File("G:\\BaiduYunDownload\\JavaEE\\MyWork\\reviewCode\\src\\reviewCode");
File destfile = new File("G:\\BaiduYunDownload\\JavaEE\\MyWork\\reviewCode\\src\\reviewCode2\\my.txt");
Myread(socfile,destfile);
}
public static void Myread(File socfile,File destfile) {
List<File> list = new ArrayList<File>();
if(!socfile.exists()){
throw new RuntimeException("非法路径");
}else if(!socfile.isDirectory()){
throw new RuntimeException("非法目录");
}
//获取目标目录集合
findFile(socfile,list);
FileReader fr = null;
FileWriter fw = null;
//将每一个字符放到map集合
Map map = new TreeMap();
try {
//将目录下的所有文件复制到同一个txt文件下
for (Iterator<File> it = list.iterator(); it.hasNext();) {
File file = it.next();
fr = new FileReader(file);
fw = new FileWriter(destfile,true);
int ch = 0;
while ((ch = fr.read()) != -1) {
if(map.get((char)ch)==null){
map.put((char)ch,1);
}else{
int i = (int)map.get((char)ch);
map.put((char)ch,++i);
}
fw.write(ch);
fw.flush();
}
}
//统计字符出现的次数
Set<Map.Entry<?,?>> set = map.entrySet();
for(Map.Entry<?,?> me:set){
System.out.println(me.getKey()+":"+me.getValue()+"次");
}
} catch (Exception e) {
System.out.println("复制文件发生错误");
}finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
throw new RuntimeException("关闭资源异常");
}
}
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException("关闭资源异常");
}
}
}
}
//查找目录下的所有文件
public static void findFile(File socfile,List<File> list) {
File[] files = socfile.listFiles();
for(File f:files){
if(f.isDirectory()){
findFile(f,list);
}else{
list.add(f);
}
}
}
}
复制代码
作者:
wzg1015
时间:
2014-10-27 22:37
没有源代码,谁也不知道你的问题。
作者:
郑飞
时间:
2014-10-31 08:36
这是main方法 我直接读文件,复制部分代码没写;
public static void main(String[] args)throws IOException
{
String dest = "E:\\MyEclipse 10\\heima\\src\\FileCharacterCount.java";
TreeMap<Character,Integer> map = new TreeMap<Character,Integer>();
BufferedReader br = new BufferedReader(new FileReader(dest));
String total = null;
String line = null;
while((line = br.readLine())!=null)
total = total+line;
br.close();
char[] arr = total.toCharArray();
for(Character c : arr)
{
if(map.containsKey(c))
map.put(c, map.get(c)+1);
map.put(c, 1);
}
for(Entry<Character,Integer> entry : map.entrySet())
{
System.out.println(entry.getKey()+":"+entry.getValue()+"次");
}
}
复制代码
作者:
Imp_x
时间:
2014-11-19 23:38
围观{:3_65:}
作者:
15621506590
时间:
2014-12-13 23:09
第一次写到这道题,跟着思路走的,没有好好封装,代码可能有些臃肿,也没有好好简化,敬请谅解
我用的是序列流,因为题意是要把文件中好几个文本写入到一个文本中,所以就使用到了序列流,详情请看代码:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
method();
}
public static void method() throws Exception{
//定义一个容器,因为只有Vector有Enumeration
Vector v = new Vector();
File file = new File("c:\\2");//源文件夹
File[] files = file.listFiles();//获取文件夹中所以的文件
Map<Object,Integer> map = new TreeMap<Object,Integer>();//定义一个Map集合,用来获取字符出现的次数
//遍历File数组,把文件中的文本通过文件读取流读取,并添加到集合中(要获取文本的绝对路径的名字)
for(File newfile : files){
v.add(new FileInputStream(newfile.getAbsolutePath()));
}
//
Enumeration en = v.elements();
//因为文本中有字符流,所以使用了字符流缓冲区(如果用字节流的话,字符会转换不成功)
BufferedReader br =
new BufferedReader(new InputStreamReader(new SequenceInputStream(en)));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\3.txt")));
int len=0;
//byte[] by = new byte[1024];
int count=0;
//读取序列流中的文本
while((len=br.read())!=-1){
//得到所读字符在集合中的值
Integer value = map.get((char)len);
if(value!=null)
count=value;
count++;
//把字符和出现的次数存入到集合中
map.put((char)len, count);
count=0;
//把读取缓冲区中的数据写入到目的文本中
bw.write(len);
}
//遍历Map集合,得到文本中字符相对应的出现次数
br.close();
bw.close();
Set<Map.Entry<Object, Integer>> set = map.entrySet();
Iterator<Map.Entry<Object, Integer>> it = set.iterator();
while(it.hasNext()){
Entry<Object, Integer> me = it.next();
System.out.println(me.getKey()+".."+me.getValue());
}
}
作者:
Rain2692
时间:
2014-12-14 12:23
怎一个唉字了得啊。。。
作者:
禾青青
时间:
2014-12-14 23:38
加油啊 加油
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2