| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3853 人关注过本帖
标题:[求助]请教一道io方面的面试题
只看楼主 加入收藏
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
 问题点数:0 回复次数:18 
[求助]请教一道io方面的面试题

要求:

如在E盘下有一个Test.txt文本文件内容是
#4
#刘德华#89#77#60
#张信哲#76#97#70
#周杰伦#89#88#90
#随便啦#87#70#80


要求通过java读取文本并把文本中的每一行后面的三个成绩相加,
最后按从大到小的顺序输出到另一个文本文件中.

输出后的文本文件内容应为:
#4
#周杰伦#267
#张信哲#243
#随便啦#237
#刘德华#226


尽量把此题做成一个模块性质的东西,并不是单独当成一道题做!
-----------------------------------------------------------------------------------

哪位朋友能做的好的帮忙写一个好吗?

我写了一个,但是过程方法太麻烦了...希望高手能帮忙写个更棒的!

期待中....................

-------------------------------------------------------------------------------------
以下是本人所写代码 :

FileRead类

import java.io.*;
import java.util.*;

class FileRead
{
static BufferedReader inReader = null;
static BufferedWriter outWriter = null;
static String strIn = "";
static String strOut = "";
static int[] scoreCount = new int[5];
static HashMap hm = new HashMap();

//读文件
public static void readFile(String fileName)
{
try
{
inReader = new BufferedReader(new FileReader(fileName));
strIn = inReader.readLine();
int num = 0;
while(strIn != null)
{
//System.out.println(strIn);
FileRead.splitFile(strIn,num);
strIn = inReader.readLine();
num++;
}
sortFile(scoreCount);
}
catch(Exception e)
{
e.printStackTrace();
}
}

//以#分割文件
public static void splitFile(String strTmp,int num)
{
String[] strArray = strTmp.split("#");
//System.out.println(strArray.length);
int score = 0;
for(int i=2;i<strArray.length;i++)
{
score += Integer.parseInt(strArray[i]);
}
scoreCount[num] = score;
hm.put(score,strArray[1]);
//System.out.println("总分:" + score);
}


//排序
public static void sortFile(int[] n)
{
int tmp;
for(int i=0;i<n.length;i++)
{
for(int j=i+1;j<n.length;j++)
{
if(n[i] > n[j])
{
tmp = n[i];
n[i] = n[j];
n[j] = tmp;
}
}
}


writeFile("E:\\New.txt");
//排好后打印出来
writeNow("#4");
System.out.println("#4");
for(int i=4;i>=1;i--)
{
String strOut = "#"+hm.get(n[i])+"#"+n[i];
writeNow(strOut); //把内容写到新文件中.
System.out.println(strOut);
}
try
{
outWriter.flush();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}

//写入文件
public static void writeFile(String fileName)
{
try
{
outWriter = new BufferedWriter(new FileWriter(fileName));
}
catch(Exception e)
{
e.printStackTrace();
}
}

//开始写内容
public static void writeNow(String strOut)
{
try
{
outWriter.write(strOut);
outWriter.newLine();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

Test类

class Test
{
public static void main(String[] args)
{
FileRead.readFile("E:\\Txt.txt");


}
}

________________________________________________________________________

搜索更多相关主题的帖子: 面试 
2007-01-19 17:25
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
用StreamTokenizer可能会更方便一些

可惜不是你,陪我到最后
2007-01-19 17:32
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 

你别说,我刚看了一下你说的这个类的大概介绍,果然好像很适用这道题目...
千里你太强了..你告诉我的这个类我以前都没有听说过..佩服,看来想成为合适的程序员我要走的路还有太长太长太长......


我在说's blog   http://www..cn
2007-01-19 17:37
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 

千里,你可以用StreamTokenizer类大概写下这道题的解法吗?

我看了看这个类,不知道用什么方法来分割流中的内容.

这个不像StringTokenizer类,有个构造方法StringTokenizer(String str, String delim) 里的delim可以指定以"#"符号来分割,而在StreamTokenizer类中有类似的方法吗?


我在说's blog   http://www..cn
2007-01-19 19:24
しΟν∈→鱈
Rank: 1
等 级:新手上路
威 望:2
帖 子:369
专家分:0
注 册:2006-10-25
收藏
得分:0 

.......试试split()方法


开开心心的过&玩每一天!!!!
2007-01-19 21:11
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

[CODE]/*
* ResultFile.java
*
* Created on 2007年1月19日, 下午8:07
* 此类抽象了表示结果的类,它代表了一个里面包含了成绩的文件
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package testStreamToken;
/**
*
* @author lbf
*/
import java.util.*;
import java.io.*;
public class ResultFile {
//表示此文件的索引
private int index=-1;
private TreeMap<String,Integer> result;//表示从名字到分数的映射
private HashMap<String,Integer> temp;//暂时的MAP

/** Creates a new instance of ResultFile */
public ResultFile(String file,char... cs){
temp=new HashMap<String,Integer>();
try{
parseFile(file,cs);
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
private void parseFile(String file,char...cs)throws IOException{
StreamTokenizer st=new StreamTokenizer(new FileReader(file));
st.eolIsSignificant(true);//设置换行符也要做为一种标志
//把传进来的字符做为一种分格符
for(char c:cs){
st.whitespaceChars(c,c);
}
//先取本文件的编号
int token=st.nextToken();
if(token==st.TT_NUMBER){
index=(int)st.nval;
}else{
throw new IOException("文件格式不符合规范!!");
}
//循环取数据,取到没有为止
out:while(true){
token=st.nextToken();
//如果标志是字符,则一直取,取到下一行为止
if(token==st.TT_WORD){
String name=st.sval;
int sum=0;
while(st.nextToken()==st.TT_NUMBER){
sum+=(int)st.nval;
}
st.pushBack();
temp.put(name,sum);
}
else if(token==st.TT_EOL){
//一行过去了
}else if(token==st.TT_EOF){//当到文件尾时,退出循环
break out;
}
}
result=new TreeMap<String,Integer>(new Comparator<String>(){
public int compare(String o1, String o2) {
return temp.get(o2)-temp.get(o1);
}
});
result.putAll(temp);
// System.out.println(result);
}
public void sortToFile(String file)throws IOException{
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
bw.write("#"+index);
bw.newLine();
for(String s:result.keySet()){
bw.write("#"+s+"#"+result.get(s));
bw.newLine();
}
bw.close();
}
public static void main(String[] args) throws Exception{
ResultFile rf=new ResultFile("x.txt",'#');
rf.sortToFile("xx.txt");
}
}[/CODE]

这个题目的最后排序上面,想了半天,最后才想到这种方法,
楼主可以自己改一下,重点看看StreamTokenizer的用法


可惜不是你,陪我到最后
2007-01-19 21:43
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 

谢谢千里,我现在就去好好看看你写的代码...


我在说's blog   http://www..cn
2007-01-19 21:59
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 
1. private TreeMap<String,Integer> result;//表示从名字到分数的映射

<>括号中是什么意思?

2. public ResultFile(String file,char... cs)

这里的形参为什么要有...呀?代理什么意思?

3. for(char c:cs)
{
st.whitespaceChars(c,c);
}

请问for(char c:cs)什么意思呀?
st.whitespaceChars(c,c); //为什么二个都是c?


我在说's blog   http://www..cn
2007-01-19 22:17
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
1,这是JDK1.5新加的泛型,表示此Map只能放入以String为键,为Integer为值的映射

2,这也是JDK1.5新加的功能,char...cs表示char的参数数量是可变的,可以传0个或以上

3,这也是JDK1.5的新功能,增强型for循环
st.whitespaceChars(c,c);这个具体可以看API,

可惜不是你,陪我到最后
2007-01-19 22:21
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 
多谢版主...让我又长了不好知识...

我在说's blog   http://www..cn
2007-01-19 22:32
快速回复:[求助]请教一道io方面的面试题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018391 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved