20175209 《MySort》和《IO-myhead》选做

20175209 《MySort》和《IO-myhead》选做

一、MySort

1.题目要求

  • 模拟实现Linux下Sort -t : -k 2的功能。
  • 要有伪代码,产品代码,测试代码(注意测试用例的设计)
  • 参考 Sort的实现。提交博客链接。

2.设计思路

  • 题目中要求为对第二列进行排序,个人设计时希望能够控制对所有列进行排序,因此需要在命令行中输入待排序的列号(这里存在一些小问题在后面问题中说明)
  • 对于给定的字符数组无法直接进行排序,采用split方法将每一行分解后将带排序的列中的内容存放至数组num[]中
  • 对获得的数组利用sort方法进行排序
  • 按照排序好的num[]数组的顺序依次输出对应行的内容

3.代码实现

  • 伪代码:

    • 输出排序前的数组
    • 命令行输入待排序的列
    • 判断要排序的是哪一列
      • 第一列:将用“:”分隔后的内容保留在字符串数组num[]中
      • 其它列:将用“:”分隔后的内容保留在整型数组num[]中
    • 对数组num[]用sort方法进行排序
    • 对排序好的数组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.码云链接

MySort

二、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 ,MyHeadT2B 选择了字符输入输出流,B2T选择了缓冲流,目的是为了读取文件中的行数
  • 将生成的随机数写入学号.txt
  • 学号.txt 中读取内容,利用换行符将读取到的内容分隔,从命令行输入想要读取的行数,依次读取并输出
  • 学号.txt 中读取内容,读取前十行内容转化为二进制并输入至学号.bin 中,这里用到了toBinaryString 方法,作用是将十进制转化为二进制,这个方法在前面也用到过
  • 学号.bin 中读取内容,转化为十进制数输出至学号_1.txt 中,用到了bufferedReaded 类中的readLine()newLine() 方法

3.运行结果

  • GenNumber
  • MyHead
  • T2B
  • B2T

4.码云链接

IO-myhead

三、遇到的问题

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

时间: 2024-08-30 10:55:01

20175209 《MySort》和《IO-myhead》选做的相关文章

MySort(选做)的实现

MySort(选做)的实现 题目内容 注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 代码框架(题目给出) import java.util.*; public class MySort { public static void main(String[] args) { String[] toSort = {"aaa:10:1:1&quo

[SDOI2016]部分题选做

听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4517 数论题,我这种不会错排的数论白痴都能手推出来,这题应该谁都能写吧. #include<cstdio> #include<cstring> #include<algorithm> #define mo 1000000007 #define ll long long #define N 1000100 using nam

20165201 课下作业第十周(选做)

#20165201 课下作业第十周(选做) 相关知识点总结 补做代码运行结果截图 补做代码链接 相关知识点的总结 课上内容的补做,结果截图 教材第十五章的代码分析 补做教材第十五章的编程题目 提交补做的博客作业的连接 主动找老师进行作业答辩 原文地址:https://www.cnblogs.com/cbmwtsl/p/9000384.html

20165334 第十三周选做

20165334 第十三周选做 设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义getter和setter. 定义至少三个构造方法,接收并初始化这些数据.覆盖(Override)toString方法,返回良好的含有多行的书的描述信息.覆盖equals方法,书名,作者,出版社和出版日期完全一致才说明两本书是一样的. 创建一个测试类Bookshelf, 其中的main方法创建并更新几个Book对象.Book至少包含三本本学期教材内容.

20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义

20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然后在验证通过后再取出. 2.在Book.java中储存测试类中输入的数据,然后验证信息是否一样,一样则输出,否则就返回false. 测试代码 Bookself.java public class Bookself { public static void main(String[] args) { Book

类定义(课下选做)

类定义(课下选做) 要求 Book类包含书名,作者,出版社和出版日期 数据都要定义getter和setter 至少三个构造方法,接收并初始化这些数据 覆盖toString方法,返回良好的含有多行的书的描述信息 覆盖equals方法,书名.作者.出版社和出版日期完全相同说明两本书相同. 创建一个测试类BookShelf 思路 根据要求最好分为两个类,即Book和BookShelf 在Book类中定义四个getter,返回书名.作者.出版社和出版日期 在BookShelf类中定义四个setter,赋

20175314薛勐 程序设计中临时变量的使用(课下测试,选做)

程序设计中临时变量的使用(课下测试,选做) 要求 定义一个数组:int arr[] = {1,2,3,4,5,6,7,8}; 打印原始数组的值:for(int i:arr){System.out.print(i + " "); } System.out.println();// 添加代码删除上面数组中的5 ... 打印出 1 2 3 4 6 7 8 0:for(int i:arr){System.out.print(i + " ");} System.out.pri

20175314薛勐 数据结构-排序(选做)

数据结构-排序(选做) 要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学

数据结构-排序(选做) 20175204

数据结构-排序(选做) 任务要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己