关于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. Apace Ignite剖析

    1.概述 Apache Ignite和Apache Arrow很类似,属于大数据范畴中的内存分布式管理系统.在<Apache Arrow 内存数据>中介绍了Arrow的相关内容,它统一了大 ...

  2. 【BZOJ2820】YY的GCD(莫比乌斯反演)

    [BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...

  3. [SCOI2010]连续攻击游戏 匈牙利算法

    觉得题目水的离开 不会匈牙利的请离开 不知道二分图的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 扯淡完了,先重温一下题目 [SC ...

  4. web安全之SQL注入

    一.sql注入是一种将sql代码添加到输入参数中 传递到sql服务器解析并执行得一种攻击手法 例: $sql = "SELECT * FROM goods WHERE Id = 1" ...

  5. 关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  6. RocketMQ与kafka对比(官方)

    淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...

  7. MyBatis关联关系

    1.一对多:一个国家对应多个城市 01.实体类 package cn.pb.bean;import java.util.Set;/** * 国家的实体类 */public class Country ...

  8. Java项目转换成Web项目

    阐述:有时候我们在Eclipse中导入一个web项目,发现导入到项目中后变成一个Java项目,这让人很蛋疼.本篇主要讲述怎样将这个本该为web项目的Java项目变身回去,以及一些在导入过程中遇到的一些 ...

  9. UML常用关系

    转载自:http://justsee.iteye.com/blog/808799和http://www.uml.org.cn/oobject/201104212.asp 关系(4种):泛化关系,实现关 ...

  10. 小米google play service停止工作解决办法,不root,不刷第三方recovery(也适用于其他的手机)

    问题: 原因是手机安卓系统是6.0.系统应用里面没有包含谷歌框架等一系列谷歌的小东西. 参考: http://www.miui.com/thread-3548436-1-1.html http://w ...