- 浏览: 519573 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (88)
- Ant (4)
- Apache (2)
- chm (1)
- Javadoc api (7)
- Spring (9)
- Maven (7)
- Hibernate (4)
- Postgresql (1)
- Velocity (1)
- 有意思的题目 (3)
- Solr (4)
- eclipse (7)
- jpa (3)
- java (8)
- excel (1)
- jsp (1)
- ubuntu (2)
- 设计模式 (1)
- memcached (1)
- tomcat (4)
- Exception (2)
- 实用小技巧 (5)
- javascript (1)
- jquery (1)
- nginx (5)
- html (1)
- 一步一步升级配置 (8)
- windows (1)
- 注册表 (1)
- chrome (2)
- tiles (1)
- git (3)
- json (1)
- log (5)
- node.js (1)
- gradle (1)
- spring-session (5)
- mysql (1)
- ajax (1)
- dubbo (1)
- springmvc (1)
- loxia (1)
最新评论
-
akang_cdx:
JPEGImageEncoder encoder = JPEG ...
【飞天奔月出品】javax.imageio.IIOException: Can't create output stream!tomcat 验证码,图片(原理) -
飞天奔月:
zuxianghuang 写道解决问题了,谢谢不客气
Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议 -
zuxianghuang:
解决问题了,谢谢
Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议 -
飞天奔月:
加上了 jdk8 String.join性能不错
字符串拼接汇总(性能对比) -
fanlei77:
JDK8的String.join可以加一下一起比较
字符串拼接汇总(性能对比)
今天在百度知道看到这么一个问题
原问题链接:http://zhidao.baidu.com/question/219278917.html#here 读取TXT文件的格式为:字母 数字 如: TOM 100 JACK 200 BILL 50 CATHY 150 然后按照数字大小排序(由大到小) 输出TXT文件格式为: JACK 200 CATHY 150 TOM 100 BILL 50 问题补充: 最后一行输出平均值=总和/人数 如:平均值=(200+150+100+50)/4=125 输出为一个新生成的TXT文件,不改变原文件 如读取文件为test.txt, 输出文件为text1.txt
觉得蛮有意思的,就动手做了个,大家也和我一起来
1.首先在D盘建了个name.txt文件,里面内容写上
TOM 100 JACK 200 BILL 50 CATHY 150
2.java 读取文件内容
我新建了个FeLongIoTest.class,新建了个读取文件内容通用方法
/** * 读取文件内容 * * @param path * 路径 * @return 文件内容string * @author 金鑫 * @version 3.0 时间:2010年1月23日 14:56:44 */ public static String getFileContent(String path){ File file = new File(path); //分配新的直接字节缓冲区 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(186140); StringBuffer stringBuffer = new StringBuffer(186140); try{ FileInputStream fileInputStream = new FileInputStream(file); //用于读取、写入、映射和操作文件的通道。 FileChannel fileChannel = fileInputStream.getChannel(); //编码字符集和字符编码方案的组合,用于处理中文,可以更改 Charset charset = Charset.forName("GBK"); while (fileChannel.read(byteBuffer) != -1){ //反转此缓冲区 byteBuffer.flip(); CharBuffer charBuffer = charset.decode(byteBuffer); stringBuffer.append(charBuffer.toString()); byteBuffer.clear(); } fileInputStream.close(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } return stringBuffer.toString(); }
3.测试下这个方法行不行
@Test public void test(){ String file = "D:/name.txt"; String content = getFileContent(file); System.out.println(content); }
输出:
TOM 100
JACK 200
BILL 50
CATHY 150
JACK 200
BILL 50
CATHY 150
ok的,我上面@Test 用了junit4.7, 没用过的你们可以换成main函数
4.数据可以读到了,应为题目中要排序,那么下一步就要把这些数据转换成集合
我这里用到了泛型, 建了一个User 实体类,存放名字和数据
package com.feilong.common.io; /** * 用户 * * @author <a href="mailto:venusdrogon@163.com">金鑫</a> * @version 1.0 2011-1-25 上午10:03:47 */ public class User{ /** * 姓名 */ private String name; /** * 数字 */ private int count; public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getCount(){ return count; } public void setCount(int count){ this.count = count; } }
5.怎么把读到的数据转成list 呢? 这么来
讲解: 使用\r\n 把每行分割成数组
因为题目中要输出最后一句统计的字符串,所以我建了个StringBuilder 装相关数据(这地方别用+直接相连,性能不高)
@Test public void test(){ String file = "D:/name.txt"; String content = getFileContent(file); //将内容以换行符转成数组 String[] rowsContents = content.split("\r\n"); //内容总共行数 int rowCount = rowsContents.length; //总和 int sum = 0; //最后一句话的数字 (200+150+100+50) StringBuilder lastRowOutBuilder = new StringBuilder(); //集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段) List<User> userList = new ArrayList<User>(); for (int i = 0; i < rowCount; i++){ String rowContent = rowsContents[i]; String[] nameAndCount = rowContent.split(" "); User user = new User(); user.setName(nameAndCount[0]); int count = Integer.parseInt(nameAndCount[1]); user.setCount(count); userList.add(user); sum += count; lastRowOutBuilder.append(count); if (i != rowCount - 1){ lastRowOutBuilder.append("+"); } } }
最后一句话拼接技巧: 循环的最后不加+号
把这个list 可以输出测试下,数据已经进去了
6.这下要到排序了
按照数字大小排序(由大到小)
因为list 本身不能排序的,需要使用Collections.sort,需要list 以及Comparator 两个参数
新建UserComparator 类,实现Comparator 接口
我在类里面增加了 排序枚举SortType,方便扩展(要是那一天改成从小到大,只要参数变一下就可以了)
import java.util.Comparator; /** * user 排序 * * @author <a href="mailto:venusdrogon@163.com">金鑫</a> * @version 1.0 2011-1-25 上午10:48:13 */ public class UserComparator implements Comparator{ /** *排序方式 * * @author <a href="mailto:venusdrogon@163.com">金鑫</a> * @version 1.0 2011-1-25 上午10:59:02 */ public enum SortType{ asc, desc } private SortType sortType; public UserComparator(SortType sortType){ this.sortType = sortType; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(Object arg0,Object arg1){ User user0 = (User) arg0; User user1 = (User) arg1; int count0 = user0.getCount(); int count1 = user1.getCount(); switch (sortType) { case asc: if (count0 > count1){ return 1; }else if (count0 < count1){ return -1; } break; case desc: if (count0 > count1){ return -1; }else if (count0 < count1){ return 1; } break; default: break; } return 0; } }
排序调用
Collections.sort(userList, new UserComparator(SortType.desc));
8.再把排序好了的list 以及最后一句话 拼接成字符串
StringBuilder builder = new StringBuilder(); for (int i = 0; i < userList.size(); i++){ User user = userList.get(i); builder.append(user.getName()); builder.append(" "); builder.append(user.getCount()); builder.append("\r"); } String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + ""; builder.append(outString); System.out.println(builder.toString());
9.最后到输出到 文件了
我新建了个write 方法
/** * 将字符串写到文件中 * * @param filePath * 文件路径 * @param content * 字符串内容 */ public static void write(String filePath,String content){ try{ //向文本输出流打印对象的格式化表示形式 //会自动创建文件,替换覆盖文字(非追加) PrintWriter printWriter = new PrintWriter(filePath); printWriter.write(content); printWriter.close(); }catch (FileNotFoundException e){ e.printStackTrace(); } }
调用
write("D:/2.txt", builder.toString());
10. 这段完整代码
@Test public void test(){ String file = "D:/name.txt"; String content = getFileContent(file); //将内容以换行符转成数组 String[] rowsContents = content.split("\r\n"); //内容总共行数 int rowCount = rowsContents.length; //总和 int sum = 0; //最后一句话的数字 (200+150+100+50) StringBuilder lastRowOutBuilder = new StringBuilder(); //集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段) List<User> userList = new ArrayList<User>(); for (int i = 0; i < rowCount; i++){ String rowContent = rowsContents[i]; String[] nameAndCount = rowContent.split(" "); User user = new User(); user.setName(nameAndCount[0]); int count = Integer.parseInt(nameAndCount[1]); user.setCount(count); userList.add(user); sum += count; lastRowOutBuilder.append(count); if (i != rowCount - 1){ lastRowOutBuilder.append("+"); } } //排序 Collections.sort(userList, new UserComparator(SortType.desc)); StringBuilder builder = new StringBuilder(); for (int i = 0; i < userList.size(); i++){ User user = userList.get(i); builder.append(user.getName()); builder.append(" "); builder.append(user.getCount()); builder.append("\r"); } String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + ""; builder.append(outString); System.out.println(builder.toString()); write("D:/2.txt", builder.toString()); }
所有的完整代码,我传了附件
这是用纯java自带的类做的,当然有更简单的,比如使用common-io
- io.rar (3.5 KB)
- 下载次数: 125
评论
9 楼
苹果超人
2011-01-26
<div class="quote_title">飞天奔月 写道</div>
<div class="quote_div">
<p> 今天在百度知道看到这么一个问题</p>
<p> </p>
<p> </p>
<p> </p>
<pre name="code" class="java">原问题链接:http://zhidao.baidu.com/question/219278917.html#here
读取TXT文件的格式为:字母 数字
如: TOM 100
JACK 200
BILL 50
CATHY 150
然后按照数字大小排序(由大到小)
输出TXT文件格式为:
JACK 200
CATHY 150
TOM 100
BILL 50
问题补充:
最后一行输出平均值=总和/人数
如:平均值=(200+150+100+50)/4=125
输出为一个新生成的TXT文件,不改变原文件
如读取文件为test.txt, 输出文件为text1.txt
</pre>
<div class="suply-content mt10">
<p> </p>
<p>觉得蛮有意思的,就动手做了个,大家也和我一起来</p>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>1.首先在D盘建了个name.txt文件,里面内容写上</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java">TOM 100
JACK 200
BILL 50
CATHY 150</pre>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>2.java 读取文件内容</strong></div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">我新建了个FeLongIoTest.class,新建了个读取文件内容通用方法</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">
<pre name="code" class="java">/**
* 读取文件内容
*
* @param path
* 路径
* @return 文件内容string
* @author 金鑫
* @version 3.0 时间:2010年1月23日 14:56:44
*/
public static String getFileContent(String path){
File file = new File(path);
//分配新的直接字节缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(186140);
StringBuffer stringBuffer = new StringBuffer(186140);
try{
FileInputStream fileInputStream = new FileInputStream(file);
//用于读取、写入、映射和操作文件的通道。
FileChannel fileChannel = fileInputStream.getChannel();
//编码字符集和字符编码方案的组合,用于处理中文,可以更改
Charset charset = Charset.forName("GBK");
while (fileChannel.read(byteBuffer) != -1){
//反转此缓冲区
byteBuffer.flip();
CharBuffer charBuffer = charset.decode(byteBuffer);
stringBuffer.append(charBuffer.toString());
byteBuffer.clear();
}
fileInputStream.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return stringBuffer.toString();
}</pre>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>3.测试下这个方法行不行</strong></div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">
<pre name="code" class="java"> @Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
System.out.println(content);
}</pre>
</div>
<div class="suply-content mt10">输出:</div>
<div class="suply-content mt10">TOM 100<br>JACK 200<br>BILL 50<br>CATHY 150</div>
<div class="suply-content mt10">ok的,我上面@Test 用了junit4.7, 没用过的你们可以换成main函数</div>
<div class="suply-content mt10"><strong>4.数据可以读到了,应为题目中要排序,那么下一步就要把这些数据转换成集合</strong></div>
<div class="suply-content mt10">我这里用到了泛型, 建了一个User 实体类,存放名字和数据</div>
<div class="suply-content mt10">
<pre name="code" class="java">package com.feilong.common.io;
/**
* 用户
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:03:47
*/
public class User{
/**
* 姓名
*/
private String name;
/**
* 数字
*/
private int count;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
}</pre>
</div>
<div class="suply-content mt10"><strong>5.怎么把读到的数据转成list 呢? 这么来</strong></div>
<div class="suply-content mt10"><strong></strong></div>
<div class="suply-content mt10">讲解: 使用\r\n 把每行分割成数组</div>
<div class="suply-content mt10"> 因为题目中要输出最后一句统计的字符串,所以我建了个StringBuilder 装相关数据(这地方别用+直接相连,性能不高)</div>
<div class="suply-content mt10">
<pre name="code" class="java">@Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.length;
//总和
int sum = 0;
//最后一句话的数字 (200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List<User> userList = new ArrayList<User>();
for (int i = 0; i < rowCount; i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
sum += count;
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
}
}
}</pre>
<br>
</div>
<div class="suply-content mt10"> 最后一句话拼接技巧: 循环的最后不加+号</div>
<div class="suply-content mt10">把这个list 可以输出测试下,数据已经进去了</div>
<div class="suply-content mt10">
<strong>6.这下要到排序了</strong> </div>
<div class="suply-content mt10">按照数字大小排序(由大到小)</div>
<div class="suply-content mt10">因为list 本身不能排序的,需要使用Collections.sort,需要list 以及Comparator 两个参数</div>
<div class="suply-content mt10">新建UserComparator 类,实现Comparator 接口</div>
<div class="suply-content mt10">我在类里面增加了 排序枚举SortType,方便扩展(要是那一天改成从小到大,只要参数变一下就可以了)</div>
<div class="suply-content mt10">
<pre name="code" class="java">import java.util.Comparator;
/**
* user 排序
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:48:13
*/
public class UserComparator implements Comparator{
/**
*排序方式
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:59:02
*/
public enum SortType{
asc, desc
}
private SortType sortType;
public UserComparator(SortType sortType){
this.sortType = sortType;
}
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object arg0,Object arg1){
User user0 = (User) arg0;
User user1 = (User) arg1;
int count0 = user0.getCount();
int count1 = user1.getCount();
switch (sortType) {
case asc:
if (count0 > count1){
return 1;
}else if (count0 < count1){
return -1;
}
break;
case desc:
if (count0 > count1){
return -1;
}else if (count0 < count1){
return 1;
}
break;
default:
break;
}
return 0;
}
}</pre>
</div>
<div class="suply-content mt10">排序调用</div>
<div class="suply-content mt10">
<pre name="code" class="java">Collections.sort(userList, new UserComparator(SortType.desc));</pre>
</div>
<div class="suply-content mt10"><strong>8.再把排序好了的list 以及最后一句话 拼接成字符串</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java"> StringBuilder builder = new StringBuilder();
for (int i = 0; i < userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
}
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());</pre>
</div>
<div class="suply-content mt10">
<strong>9.最后到输出到 文件了</strong> </div>
<div class="suply-content mt10">我新建了个write 方法</div>
<div class="suply-content mt10">
<pre name="code" class="java"> /**
* 将字符串写到文件中
*
* @param filePath
* 文件路径
* @param content
* 字符串内容
*/
public static void write(String filePath,String content){
try{
//向文本输出流打印对象的格式化表示形式
//会自动创建文件,替换覆盖文字(非追加)
PrintWriter printWriter = new PrintWriter(filePath);
printWriter.write(content);
printWriter.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}
}</pre>
</div>
<div class="suply-content mt10">调用</div>
<div class="suply-content mt10">
<pre name="code" class="java">write("D:/2.txt", builder.toString());</pre>
</div>
<div class="suply-content mt10"><strong>10. 这段完整代码</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java">@Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.length;
//总和
int sum = 0;
//最后一句话的数字 (200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List<User> userList = new ArrayList<User>();
for (int i = 0; i < rowCount; i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
sum += count;
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
}
}
//排序
Collections.sort(userList, new UserComparator(SortType.desc));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
}
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());
write("D:/2.txt", builder.toString());
}</pre>
</div>
<div class="suply-content mt10">所有的完整代码,我传了附件</div>
<div class="suply-content mt10">这是用纯java自带的类做的,当然有更简单的,比如使用common-io</div>
</div>
<p> </p>
<div class="quote_div">
<p> 今天在百度知道看到这么一个问题</p>
<p> </p>
<p> </p>
<p> </p>
<pre name="code" class="java">原问题链接:http://zhidao.baidu.com/question/219278917.html#here
读取TXT文件的格式为:字母 数字
如: TOM 100
JACK 200
BILL 50
CATHY 150
然后按照数字大小排序(由大到小)
输出TXT文件格式为:
JACK 200
CATHY 150
TOM 100
BILL 50
问题补充:
最后一行输出平均值=总和/人数
如:平均值=(200+150+100+50)/4=125
输出为一个新生成的TXT文件,不改变原文件
如读取文件为test.txt, 输出文件为text1.txt
</pre>
<div class="suply-content mt10">
<p> </p>
<p>觉得蛮有意思的,就动手做了个,大家也和我一起来</p>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>1.首先在D盘建了个name.txt文件,里面内容写上</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java">TOM 100
JACK 200
BILL 50
CATHY 150</pre>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>2.java 读取文件内容</strong></div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">我新建了个FeLongIoTest.class,新建了个读取文件内容通用方法</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">
<pre name="code" class="java">/**
* 读取文件内容
*
* @param path
* 路径
* @return 文件内容string
* @author 金鑫
* @version 3.0 时间:2010年1月23日 14:56:44
*/
public static String getFileContent(String path){
File file = new File(path);
//分配新的直接字节缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(186140);
StringBuffer stringBuffer = new StringBuffer(186140);
try{
FileInputStream fileInputStream = new FileInputStream(file);
//用于读取、写入、映射和操作文件的通道。
FileChannel fileChannel = fileInputStream.getChannel();
//编码字符集和字符编码方案的组合,用于处理中文,可以更改
Charset charset = Charset.forName("GBK");
while (fileChannel.read(byteBuffer) != -1){
//反转此缓冲区
byteBuffer.flip();
CharBuffer charBuffer = charset.decode(byteBuffer);
stringBuffer.append(charBuffer.toString());
byteBuffer.clear();
}
fileInputStream.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return stringBuffer.toString();
}</pre>
</div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10"><strong>3.测试下这个方法行不行</strong></div>
<div class="suply-content mt10"> </div>
<div class="suply-content mt10">
<pre name="code" class="java"> @Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
System.out.println(content);
}</pre>
</div>
<div class="suply-content mt10">输出:</div>
<div class="suply-content mt10">TOM 100<br>JACK 200<br>BILL 50<br>CATHY 150</div>
<div class="suply-content mt10">ok的,我上面@Test 用了junit4.7, 没用过的你们可以换成main函数</div>
<div class="suply-content mt10"><strong>4.数据可以读到了,应为题目中要排序,那么下一步就要把这些数据转换成集合</strong></div>
<div class="suply-content mt10">我这里用到了泛型, 建了一个User 实体类,存放名字和数据</div>
<div class="suply-content mt10">
<pre name="code" class="java">package com.feilong.common.io;
/**
* 用户
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:03:47
*/
public class User{
/**
* 姓名
*/
private String name;
/**
* 数字
*/
private int count;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
}</pre>
</div>
<div class="suply-content mt10"><strong>5.怎么把读到的数据转成list 呢? 这么来</strong></div>
<div class="suply-content mt10"><strong></strong></div>
<div class="suply-content mt10">讲解: 使用\r\n 把每行分割成数组</div>
<div class="suply-content mt10"> 因为题目中要输出最后一句统计的字符串,所以我建了个StringBuilder 装相关数据(这地方别用+直接相连,性能不高)</div>
<div class="suply-content mt10">
<pre name="code" class="java">@Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.length;
//总和
int sum = 0;
//最后一句话的数字 (200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List<User> userList = new ArrayList<User>();
for (int i = 0; i < rowCount; i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
sum += count;
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
}
}
}</pre>
<br>
</div>
<div class="suply-content mt10"> 最后一句话拼接技巧: 循环的最后不加+号</div>
<div class="suply-content mt10">把这个list 可以输出测试下,数据已经进去了</div>
<div class="suply-content mt10">
<strong>6.这下要到排序了</strong> </div>
<div class="suply-content mt10">按照数字大小排序(由大到小)</div>
<div class="suply-content mt10">因为list 本身不能排序的,需要使用Collections.sort,需要list 以及Comparator 两个参数</div>
<div class="suply-content mt10">新建UserComparator 类,实现Comparator 接口</div>
<div class="suply-content mt10">我在类里面增加了 排序枚举SortType,方便扩展(要是那一天改成从小到大,只要参数变一下就可以了)</div>
<div class="suply-content mt10">
<pre name="code" class="java">import java.util.Comparator;
/**
* user 排序
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:48:13
*/
public class UserComparator implements Comparator{
/**
*排序方式
*
* @author <a href="mailto:venusdrogon@163.com">金鑫</a>
* @version 1.0 2011-1-25 上午10:59:02
*/
public enum SortType{
asc, desc
}
private SortType sortType;
public UserComparator(SortType sortType){
this.sortType = sortType;
}
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object arg0,Object arg1){
User user0 = (User) arg0;
User user1 = (User) arg1;
int count0 = user0.getCount();
int count1 = user1.getCount();
switch (sortType) {
case asc:
if (count0 > count1){
return 1;
}else if (count0 < count1){
return -1;
}
break;
case desc:
if (count0 > count1){
return -1;
}else if (count0 < count1){
return 1;
}
break;
default:
break;
}
return 0;
}
}</pre>
</div>
<div class="suply-content mt10">排序调用</div>
<div class="suply-content mt10">
<pre name="code" class="java">Collections.sort(userList, new UserComparator(SortType.desc));</pre>
</div>
<div class="suply-content mt10"><strong>8.再把排序好了的list 以及最后一句话 拼接成字符串</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java"> StringBuilder builder = new StringBuilder();
for (int i = 0; i < userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
}
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());</pre>
</div>
<div class="suply-content mt10">
<strong>9.最后到输出到 文件了</strong> </div>
<div class="suply-content mt10">我新建了个write 方法</div>
<div class="suply-content mt10">
<pre name="code" class="java"> /**
* 将字符串写到文件中
*
* @param filePath
* 文件路径
* @param content
* 字符串内容
*/
public static void write(String filePath,String content){
try{
//向文本输出流打印对象的格式化表示形式
//会自动创建文件,替换覆盖文字(非追加)
PrintWriter printWriter = new PrintWriter(filePath);
printWriter.write(content);
printWriter.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}
}</pre>
</div>
<div class="suply-content mt10">调用</div>
<div class="suply-content mt10">
<pre name="code" class="java">write("D:/2.txt", builder.toString());</pre>
</div>
<div class="suply-content mt10"><strong>10. 这段完整代码</strong></div>
<div class="suply-content mt10">
<pre name="code" class="java">@Test
public void test(){
String file = "D:/name.txt";
String content = getFileContent(file);
//将内容以换行符转成数组
String[] rowsContents = content.split("\r\n");
//内容总共行数
int rowCount = rowsContents.length;
//总和
int sum = 0;
//最后一句话的数字 (200+150+100+50)
StringBuilder lastRowOutBuilder = new StringBuilder();
//集合 存储数据,这题最快的方法是用map 存储值,考虑到 扩展(是否姓名有重复,是否以后会增加属性字段)
List<User> userList = new ArrayList<User>();
for (int i = 0; i < rowCount; i++){
String rowContent = rowsContents[i];
String[] nameAndCount = rowContent.split(" ");
User user = new User();
user.setName(nameAndCount[0]);
int count = Integer.parseInt(nameAndCount[1]);
user.setCount(count);
userList.add(user);
sum += count;
lastRowOutBuilder.append(count);
if (i != rowCount - 1){
lastRowOutBuilder.append("+");
}
}
//排序
Collections.sort(userList, new UserComparator(SortType.desc));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < userList.size(); i++){
User user = userList.get(i);
builder.append(user.getName());
builder.append(" ");
builder.append(user.getCount());
builder.append("\r");
}
String outString = "平均值=(" + lastRowOutBuilder.toString() + ")/" + rowCount + "=" + sum / rowCount + "";
builder.append(outString);
System.out.println(builder.toString());
write("D:/2.txt", builder.toString());
}</pre>
</div>
<div class="suply-content mt10">所有的完整代码,我传了附件</div>
<div class="suply-content mt10">这是用纯java自带的类做的,当然有更简单的,比如使用common-io</div>
</div>
<p> </p>
8 楼
chan.d
2011-01-26
并没有用到泛型。
7 楼
kunanfo
2011-01-26
finally都不需要写?看来老师教错了
6 楼
xiang37
2011-01-26
假如考虑到读取文件的大小,如:有100W条记录,那么排序、存入数据库的效率等都需要考虑的!支持楼主的做法
5 楼
akunamotata
2011-01-26
毛毛k孤鸿 写道
简单问题复杂化
职业病
4 楼
毛毛k孤鸿
2011-01-26
简单问题复杂化
3 楼
yangyi
2011-01-25
yangguo 写道
yangyi 写道
其实Collections.sort最终用的也是归并,但是不支持文件归并。这题考的应该是算法吧
yang兄虽然你比较niubility,也不要总是把简单问题复杂化啊。
呵呵,这个解决方案肯定是大型机不是分布式,而且是内存特大的那种。还没有用多路归并,多线程,MapReduce。:))
2 楼
yangguo
2011-01-25
yangyi 写道
其实Collections.sort最终用的也是归并,但是不支持文件归并。这题考的应该是算法吧
yang兄虽然你比较niubility,也不要总是把简单问题复杂化啊。
1 楼
yangyi
2011-01-25
其实Collections.sort最终用的也是归并,但是不支持文件归并。这题考的应该是算法吧
相关推荐
读取一个文件中的整数,并将它们从小到大排序,最后输出排序后到另一个文件中
首先,我们需要理解Java中的文件操作和数据序列化,这两个是读写成绩表的关键技术。 1. **文件操作**:在Java中,我们通常使用`java.io`包中的类进行文件操作。比如`File`类用于表示文件或目录,`BufferedReader`和...
在测试过程中,我们可以利用Java的序列化机制,先将数组写入文件,然后使用排序算法对文件内容进行排序,最后再读取结果并验证其正确性。这种方式对于处理大数据集尤其有用,因为它避免了将整个数据集加载到内存中。...
- `r+`:读写模式,可以读取和修改文件内容。 #### 2. 数据读取 一旦文件被打开,可以通过以下方法读取其内容: - `read()`: 读取整个文件。 - `readline()`: 按行读取文件。 - `readlines()`: 将文件按行读取为...
在“xiancheng”这个压缩包文件中,可能包含了实现上述多线程排序算法的Java源代码。通过分析这些代码,你可以深入理解如何在实际项目中应用多线程优化排序算法,并学习如何平衡并行化带来的收益与额外的系统开销。 ...
在本例中,虽然未具体给出排序的实现,但可以通过Java自带的`Arrays.sort()`方法轻松完成。 #### 四、事件监听与响应 - **按钮事件监听**: 使用`ActionListener`接口来监听按钮点击事件。当按钮被点击时,会调用`...
排序则可以通过读取所有留言到内存,排序后再写回文件实现。 此外,还可以添加一些额外的功能,如验证用户身份(用户名和密码),通过加密技术保护敏感信息,以及增加留言的编辑和删除功能。编辑通常涉及找到旧的...
在这个JAVA实验报告中,我们关注的是如何通过编程处理文本文件,特别是涉及到文件的读写操作。实验的主题是“举重成绩单”,目标是掌握JAVA中的字符输入、输出流的使用。 1. **字符输入流(Character Input Stream...
我们可以创建一个FileOutputStream对象,然后逐个打开小文件,使用FileInputStream读取其内容,再通过FileOutputStream写入。确保每个小文件的数据都被正确地追加到新文件中。 在实现这些功能时,需要注意几个关键...
- 使用`java.nio`包的`Channels`和`ByteStreams`,可以高效地读取大文件并发送到输出流。 6. **用户认证与权限控制**: - 提及的`user-auth-center`可能指的是用户认证中心,这是实现网盘功能时的重要组成部分。...
在JAVA中,可以利用字符串处理、文件读写等技术来实现这一过程。例如,使用Java的`BufferedReader`类逐行读取DXF文件,然后根据组码的不同来解析并存储相应的图形实体数据。 #### 3 JAVA处理DXF文件示例 为了更...
多种方式写文件内容, 按字节写文件内容、按字符写文件内容、按行写文件内容 ; 添加内容到文件结尾;文件的分割和合并;使用StreamTokenizer统计文件的字符数; 序列化和反序列化对象(将不长用的对象暂时持久化到...
综合来看,给出的文件内容涉及了Java中文件处理的一些基本操作和高级应用,包括文件的读写、异常处理、二进制文件的复制等。通过这些例题和代码片段,可以更好地理解Java I/O操作的细节和应用场景。这些知识点对于...
Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...
综上所述,基于Java Swing的体温检测系统集成了多种核心功能和技术,从数据管理到用户交互,再到文件操作,体现了Java在开发桌面应用时的强大能力。开发者在设计和实现这个系统时,需要充分考虑用户需求、数据安全和...
接着,程序会读取该文件中的字母内容,对其进行升序排序处理,并将排序后的结果保存到另一个文件中。最后,程序会在控制台上打印出排序后的字母序列。 #### 二、Java基础知识回顾 1. **基本输入流**: - `...
修改商品则涉及读取原始信息、更新后再写回;删除商品可能需要标记商品为已删除,或者直接从文件中移除。 总的来说,"文件方式商品管理系统"是一个综合性的学习项目,涵盖了文件操作、GUI设计、数据处理等多个方面...
【Java程序设计】实验报告三主要探讨了如何利用Java编程语言设计一个图形用户界面(GUI)程序,该程序能够接收用户输入的五个浮点数和一个文件路径,将这些数值保存到文件中,然后从文件读取数据进行排序,最后将...
- **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一次编写,到处运行”的...
7. **IO流与文件操作**:学习使用File类进行文件的创建、删除、重命名等操作,以及使用FileReader/Writer、BufferedReader/Writer进行文本文件的读写。编写一个程序,实现文件的复制或者内容的追加。 8. **接口与多...