关于MySort的进一步实践

课堂作业题目如下:

  • 模拟实现Linux下Sort -t : -k 2的功能。参考Sort的实现。提交码云链接和代码运行截图。

    import java.util.*;
    public class MySort {
    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"};
    
        System.out.println("Before sort:");
        for (String str: toSort)
            System.out.println(str);
    
        //sort
        List<String> list = new ArrayList();
        for (String str: toSort)
            list.add(str);
    
        Collections.sort(list);
    
        System.out.println("After sort:");
        for( String str : list)
            System.out.println(str);
    }
    }

    在这个模板中,要实现的是对使用“:”分隔的第二列字符串按照从小到大的顺序重新排列,之前在课堂上没有做出来是感觉对于设计思路不是很清晰,知道起点和目的,就是不知道中间要如何衔接,我按照老师上课时给出的一个更详细的模板,进行实验:

    import java.util.*;
    public class MySort
    {
    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"};
    
        System.out.println("Before sort:");
    
        for (String str: toSort)
            System.out.println(str);
        //sort
        int [] k3 = new int[toSort.length];
        for (int i = 0; i < toSort.length; i++)
        {
            String [] tmp = toSort[i].split(":");
            k3[i] = Integer.parseInt(...);
        }
        Arrays.sort(k3);
    
        System.out.println("After sort:");
    
        for (int i = 0; i < k3.length; i++)
            for (int j = 0; j < toSort.length; j++)
                if (k3[i] == toSort[j])
                    System.out.println(...);
    }
    }
  • 显然,有三行是要自己添加的,看似比较明确的模板,我对于构造出的k3数组,以及后面的if (k3[i] == toSort[j])并不理解,这个模板的几个部分是需要修正或添加的,例如:
    k3[i] = Integer.parseInt(...);
    if (k3[i] == toSort[j])
    System.out.println(...);

  • 关于之前的命令行,我的掌握程度还比较熟练,但是对于代码实现就有一定难度,课堂上娄老师提示我们使用split方法。在英文中,split作动词是分裂、分开的意思,在命令行中split命令可以将一个大文件分割成很多个小文件或者小片段,在Java的方法中,用法相似:

  • 简单来说就是:根据所规定划分字符串的字符来分割整个字符串。
    在命令行中,sort命令中的-t选项的功能是指定栏位分隔符为冒号
    现在要实现的就是用split指定,于是就有代码:
    String [] tmp = toSort[i].split(":");
    接着继续思考,我最初完成的代码出现以下错误:


    看的出来,主要错误是因为数组下标不对应,从而导致该字符串不能转换为适当格式,终止程序运行。
    当时我还没意识到这一点,就进行了新的尝试,再循环体内增加一个输出,看看效果,到底是什么错误:

    在尝试输出后,原错误并没有解决,同时我还出现了新的疑问:输出的那串String@ XXX是什么,为什么会产生这样的输出?

    在脑子有点乱的情况下,我选择使用jdb调试程序,果然是k3[i] = Integer.parseInt(tmp[i]);这一行代码出现了问题,

    看了一下JDK又问了王彪,之后又测试了一下,终于弄懂了为什么出错,tmp中的元素有非数字类型的字符串,从而在执行parseInt的时候不能转换为适当格式,因为对于这个“aaa”字符串在没有规定基数转换的情况下,应该是默认为十进制了,而我用十进制和八进制测试了一下,发现都不能转换:


    只有改成十六进制的时候才能转换成相应数字,而这个字符串的转换又遵循一定的顺序。

    所以对于tmp的第0个下标,即第一个“:”前的元素,都不能进行无基数转换,而对于只有数字的字符串,只要不越界,就能进行对应转换,所以这时候就要将i改为1,然后这个问题就此解决。

  • 下一个问题是为什么会出现String@ XXX,这让我想到了以前的一道考试题:

    为什么输出结果会是这样?


    我搜索了一下,这串@ 后面的字母及数字被称为“哈希码”,就如同原来调用哈希算法(Hash)产生的散列值。产生此问题的主要原因是:
    当一个Object实例被转化成String时,Java就会自动调用toString()方法返回一个String。
    System.out.println标准输出,只能输出String,所以,所有需要输出的Object都会被转化成String。
    如果你没有覆盖toString,那么,Java会自动调用最上层父类Object的toString()方法。
    其内容如下:

    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 

    所以,没有定义toString,并用System.out.println输出实例的时候,会看到类名和哈希码。
    所以要想出现原字符串,只需在IDEA中根据相应提示对该语句进行修改即可。改为:Arrays.toString(tmp)

    对于如何实现“将第二列按照从小到大的顺序排序”,我实在想不出来,于是询问了王彪,在大致理解了他的设计后,认为他设计的这条语句非常精妙:

    if (k3[i]==Integer.parseInt((toSort[j].split(":"))[1]))

    这条语句不像substring方法或者是charAt方法那样根据字符串的索引来输出,而是摆脱了字符串位置的约束,进行分隔符内容的输出,更具有普遍性和适用性,所以最后我的条件语句也是参考王彪的进行测试:
    源代码:

    import java.util.*;
    import java.lang.Integer;
    public class MySort
    {
       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"};
      System.out.println("Before sort:");
      for (String str: toSort)
     System.out.println(str);
         //sort
         int [] k3 = new int[toSort.length];
         for (int i = 0; i < toSort.length; i++)
         {
            String [] tmp = toSort[i].split(":");
            //System.out.println(Arrays.toString(tmp));
            k3[i] = Integer.parseInt(tmp[1]);
         }
         Arrays.sort(k3);
         System.out.println("After sort:");
         for (int i = 0; i < k3.length; i++)
            for (int j = 0; j < toSort.length; j++)
               if (k3[i] == Integer.parseInt((toSort[j].split(":"))[1]))
                  System.out.println(toSort[j]);
       }
    }

    【源代码链接】
    运行结果:

感悟

  • 首先感觉这次作业有一定难度,对于我来说,会经常产生一些方法调用格式错误或者想到了但是难以用代码实现的问题,所以还是要继续试错,最好能通过练习掌握一些避免此类问题的技巧。我对于数组的练习还是少了一些。
  • 其次,在调试代码的过程中,我觉得IDEA比jdb方便很多。
  • 虽然最后的条件语句是参考王彪的,但是在之前试错的过程中还是收获了不少,每一个错误都可以去深入思考,至今我仍觉得,试错是一件很有意义的事。
  • 我会继续保持这种处于“学习区”的状态,对接下来的内容一步步地学习。

参考资料

20162330 第10周 MySort实验的更多相关文章

  1. 20145206《Java程序设计》第10周学习总结

    20145206 <Java程序设计>第10周学习总结 博客学习内容总结 什么是网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定 ...

  2. 20145208 《Java程序设计》第10周学习总结

    20145208 <Java程序设计>第10周学习总结 教材学习内容总结 了解JAVA网络编程的基础知识 这一部分知识的学习在我的实验中有叙述实验五 补充内容: 在现有的网络中,网络通讯的 ...

  3. 20145222黄亚奇《Java程序设计》第10周学习总结

    20145222 <Java程序设计>第10周学习总结 学习总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接 ...

  4. 201521123082 《Java程序设计》第10周学习总结

    201521123082 <Java程序设计>第10周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. A ...

  5. 201521123107 《Java程序设计》第10周学习总结

    第10周作业-异常与多线程 1.本周学习总结 2.书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有try块中 ...

  6. 201521123067 《Java程序设计》第10周学习总结

    201521123067 <Java程序设计>第10周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 Q1.final ...

  7. 20155219 2016-2017-2 《Java程序设计》第10周学习总结

    20155219 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计 ...

  8. 2018面向对象程序设计(Java)第10周学习指导及要求

    2018面向对象程序设计(Java)第10周学习指导及要求(2018.11.1-2018.11.4)  学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接口的定 ...

  9. 20155205 2016-2017-2 《Java程序设计》第10周学习总结

    20155205 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络基础 什么是网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数 ...

随机推荐

  1. es6学习笔记--let和const

    今天学习了es6中的let和const命令,借此整理一下笔记. let : let 和 var 的声明方式一样,但有 var 比不上的优点.下面用 var 和 let 的例子来加深对 let 的理解. ...

  2. 深究ASP.NET Session

    Session 本质 & 访问方法 Session 本质 是 HttpSessionState 类 link Session 访问方法 HttpContext.Session Page.Ses ...

  3. Docker学习——Lepus部署

    Lepus部署(基于docker)及mysql慢查询配置 介绍 Lepus是一个由Python+PHP开发的数据库企业级监控系统,可用于MySQL/Oracle/MongoDB/Redis 下载镜像 ...

  4. php+sqlServer 2008R2 PHPstudy下数据库环境搭建

    简要:小主从事PHP二年,期间一直做后台;在过程中遇到一个奇葩的组合就是PHP+sqlServer应用场景,希望能够跟各位PHP大神分享和学习探索,如果有不对或者好的建议告知下:*~*! 一.下载sq ...

  5. 都是SCI惹的祸?

    都是SCI惹的祸? 过去只知道地质学家需要跋山涉水寻找宝藏,最近同一位海外归来的学者谈起,方知少数其它领域的科研人员,也"跋山涉水",在内地研究机构寻找可以写好文章的研究成果,不管 ...

  6. 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

    [Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...

  7. [HNOI2010]BUS 公交线路

    题面 Bzoj Sol 状压很显然 重点在于转移:题目就相当与每\(p\)长度的车站必须有且仅有\(k\)个被经过 那么转移时状压的二进制一定要有\(k\)个一 且两个相邻转移的状态之间必须满足:设为 ...

  8. tensorflow第一篇---numpy模块

    写在前面: 自学tensorflow半个月,博友们给了我很多帮助,这是我第一篇原创的博文,我想把之前的知识梳理一遍,我会分享我一些在学习过程中遇到的问题,我目前只有这些......... 在介绍ten ...

  9. python写一个信息收集四大件的脚本

    0x0前言: 带来一首小歌: 之前看了小迪老师讲的课,仔细做了些笔记 然后打算将其写成一个脚本. 0x01准备: requests模块 socket模块 optparser模块 time模块 0x02 ...

  10. assert断言检测

    assert 是宏,非函数,包含在assert.h 头文件中. 如果其后面括号里的值为假,则程序终止运行,并提示出错.这个 宏只在 Debug 版本上起作用,而在 Release 版本被编译器完全优化 ...