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.运行截图
  • 第一列排序
    1272589-20190517235436593-950682298.png

  • 第二列排序
    1272589-20190517235442352-1653938138.png

  • 第三列排序
    1272589-20190517235446274-2124917530.png

  • 第四列排序
    1272589-20190517235451397-2056747642.png

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
    1272589-20190517235519433-2010330119.png

  • MyHead
    1272589-20190517235533267-2058580288.png

  • T2B
    1272589-20190517235539909-841715202.png

  • B2T
    1272589-20190517235545127-1234491244.png

4.码云链接

IO-myhead

三、遇到的问题

MySort
  • 问题1:开始时将分隔后的内容都以字符串数组的形式储存,但在按照第四行升序排序时出现错误
    1272589-20190517235603708-1107923909.png

  • 解决:原因是sort方法只对第一位进行了升序排序,对于列中元素位数不同时会出现错误排序的情况,因此排序时分为了两种情况,当排序第一列时以字符串数组形式储存,其他列时以整型数组形式储存,但这样的代码只能适用于字符串数组已知的情况下

IO-myhead
  • 问题1:开始时在生成随机数选择用Math类中的Random()方法,但提示如下问题:
    1272589-20190517235619678-1937717147.png

  • 解决:选择java.util包中的Random()方法
  • 问题2:开始时选用了字节输入输出流,但发现不能以字符串的形式向文本中输入内容
    1272589-20190517235626379-1746177463.png

  • 解决:更改为使用字符输入输出流
  • 问题3:在产生的20175209.txt 文件中发现只产生了一行数字
    1272589-20190517235637602-530768946.png

  • 解决:在检查代码后认为应该是在换行时出现了问题,在网上搜索后发现在向文件中写入内容时的换行应该是"\r\n"而不是"\n"

四、参考资料

转载于:https://www.cnblogs.com/wangzihong0213/p/10884293.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里给出两种实现方式: 1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): # Last i elements are already sorted for j in range(0, n-i-1): # Traverse the array from 0 to n-i-1 # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] ``` 2. 快速排序 快速排序使用分治法(Divide and conquer)策略来把一个序列分为两个子序列。具体算法描述如下: - 从数列中挑出一个元素,称为 “基准”(pivot); - 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作; - 递归地(recursive)把小于基准值元素的子序列和大于基准值元素的子序列排序。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[0] left = [x for x in arr[1:] if x < pivot] right = [x for x in arr[1:] if x >= pivot] return quick_sort(left) + [pivot] + quick_sort(right) ``` 以上两种排序算法都可以实现排序,具体选择哪种取决于具体的需求和数据规模。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值