20175209 《MySort》和《IO-myhead》选做
2020-02-03 04:19
260 查看
20175209 《MySort》和《IO-myhead》选做
一、MySort
1.题目要求
- 模拟实现Linux下Sort -t : -k 2的功能。
- 要有伪代码,产品代码,测试代码(注意测试用例的设计)
- 参考 Sort的实现。提交博客链接。
2.设计思路
- 题目中要求为对第二列进行排序,个人设计时希望能够控制对所有列进行排序,因此需要在命令行中输入待排序的列号(这里存在一些小问题在后面问题中说明)
- 对于给定的字符数组无法直接进行排序,采用split方法将每一行分解后将带排序的列中的内容存放至数组num[]中
- 对获得的数组利用sort方法进行排序
- 按照排序好的num[]数组的顺序依次输出对应行的内容
3.代码实现
伪代码:
输出排序前的数组- 命令行输入待排序的列
判断要排序的是哪一列
第一列:将用“:”分隔后的内容保留在字符串数组num[]中- 其它列:将用“:”分隔后的内容保留在整型数组num[]中
对排序好的数组num[]进行遍历,用字符串数组中每一行对应位置的元素依次与num[]数组进行比较,相同则输出toSort数组
产品代码
package MySort; import java.util.*; public class MySort { public void mysort(String []toSort,int a) { System.out.println("Before sort:"); for (String str: toSort) { System.out.println(str); } int length = toSort.length; if(a==0) { String [] num =new String[length]; for(int i = 0;i<length;i++) { num[i] =toSort[i].split(":")[a]; } Arrays.sort(num); System.out.println("After sort:"); for(int i = 0;i<length;i++) { for(int j = 0;j<length;j++) { if(num[i].equals(toSort[j].split(":")[a])) { System.out.println(toSort[j]); } } } } else { int[] num = new int[length]; for (int i = 0; i < length; i++) { num[i] = Integer.parseInt(toSort[i].split(":")[a]); } Arrays.sort(num); System.out.println("After sort:"); for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (num[i] == Integer.parseInt(toSort[j].split(":")[a])) { System.out.println(toSort[j]); } } } } } }
- 对代码的说明:这里将代码分成两部分进行比较,即第一列和其它列,原因是toSort数组最后一列中的数字的位数不同,如果都以字符串形式存储那么在比较最后一列是sort方法只能比较第一位的数字,会导致结果错误;此外length为字符串数组的长度,由于将字符串分解后某一列的元素存放在num[]数组中,因此得到的num[]数组与原来的toSort数组的长度一定相同,因此比较时均可用参数length作为循环条件
- 测试代码
package MySort; public class MySortTest { public static void main(String [] args) { String [] toSort = {"aaa:10:1:1", "ccc:30:3:4", "bbb:50:4:5", "ddd:20:5:3", "eee:40:2:20"}; MySort mySort = new MySort(); int a = Integer.parseInt(args[0]); mySort.mysort(toSort,a); } }
4.运行截图
第一列排序
第二列排序
第三列排序
第四列排序
5.码云链接
二、IO-myhead
1.题目要求
- 编写代码GenNumber.java生成一个文本文件 “你的学号.txt”, 一共“你的学号的后三位行”,每行一个数字,该数字是1-你的学号后四位的一个随机数,提交代码和生成文件
- 研究linux的head命令, 实现head -n 的功能MyHead.java, 用“你的学号.txt”进行测试,执行 java MyHead n 打印“你的学号.txt”前n行
- 编写T2B.java, 将 “你的学号.txt”的前十行转化成二进制文件“你的学号.bin” ,可以用Linux 下od命令或Windows下的winhex工具查看转化结果,提交代码和生成文件
- 编写B2T.java, 将 “你的学号.bin”的转化成文本文件“你的学号.txt”, 每行除了有数据外,还要添加行号,提交代码和生成文件
- 课上无法完成的课下完成需要答辩
2.设计思路
- 首先建立
学号.txt
文件 - 选则文件输入输出的方法,这里
GenNumer
,MyHead
和T2B
选择了字符输入输出流,B2T
选择了缓冲流,目的是为了读取文件中的行数 - 将生成的随机数写入
学号.txt
中 - 从
学号.txt
中读取内容,利用换行符将读取到的内容分隔,从命令行输入想要读取的行数,依次读取并输出 - 从
学号.txt
中读取内容,读取前十行内容转化为二进制并输入至学号.bin
中,这里用到了toBinaryString
方法,作用是将十进制转化为二进制,这个方法在前面也用到过 - 从
学号.bin
中读取内容,转化为十进制数输出至学号_1.txt
中,用到了bufferedReaded
类中的readLine()
和newLine()
方法
3.运行结果
GenNumber
MyHead
T2B
B2T
4.码云链接
三、遇到的问题
MySort
问题1:开始时将分隔后的内容都以字符串数组的形式储存,但在按照第四行升序排序时出现错误
解决:原因是sort方法只对第一位进行了升序排序,对于列中元素位数不同时会出现错误排序的情况,因此排序时分为了两种情况,当排序第一列时以字符串数组形式储存,其他列时以整型数组形式储存,但这样的代码只能适用于字符串数组已知的情况下
IO-myhead
问题1:开始时在生成随机数选择用Math类中的Random()方法,但提示如下问题:
- 解决:选择java.util包中的Random()方法
问题2:开始时选用了字节输入输出流,但发现不能以字符串的形式向文本中输入内容
- 解决:更改为使用字符输入输出流
问题3:在产生的
20175209.txt
文件中发现只产生了一行数字
解决:在检查代码后认为应该是在换行时出现了问题,在网上搜索后发现在向文件中写入内容时的换行应该是"\r\n"而不是"\n"
四、参考资料
转载于:https://www.cnblogs.com/wangzihong0213/p/10884293.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- (七)java.io.ObjectInputStream类详解
- 解决 System.IO.FileNotFoundException: 未能加载文件或程序集
- java.io.EOFException错误
- IO端口和IO内存
- node socket.io web
- eclipse启动Tomcat时报错:严重: IOException while loading persisted sessions: java.io.EOF
- Java IO简介
- (九)java.io.FileSystem抽象类详解
- 转贴:Mark Russinovich的Inside Vista Kernel系列文章,讲到了Vista内核的调度,IO,内存管理,缓存,事务处理,安全等众多新特性
- IO输入输出流的学习笔记
- nodejs--socketIo的基础应用
- 黑马程序员—【Java基础篇】之IO流(二)———File类、递归、IO其它流和编码表
- 查看各数据库文件的IO使用情况
- Go 标准库介绍五: io
- (九)java.io.FileSystem抽象类详解
- java关于(io&nio) 的 文件copy例子
- Java——集合IO综合应用
- Objective-C Value Objects --来自objc.io文章的翻译
- System.IO.FileLoadException: 未能加载文件或程序集“Microsoft.ReportingServices.UpgradeScripts, Version=10.0.0.0
- 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 等一系列问题