关于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常用知识点小结

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准. 因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).虽然浏览器在不 ...

  2. jpgraph 折线图--解决中文乱码的问题(标题和图例)

    在jpgraph根目录中: 如Jpg\jpgraph_ttf.inc.php 中开头添加 define('CHINESE_TTF_FONT','SIMYOU.TTF'); \Jpg\jpgraph_l ...

  3. 【BZOJ3924】幻想乡战略游戏(动态点分治)

    [BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...

  4. 【BZOJ3223】文艺平衡树(Splay)

    题面 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  5. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  6. React-Native安装使用

    先附上React-Native官方文档中文版:http://wiki.jikexueyuan.com/project/react-native/getting-started.html 好,接下来我们 ...

  7. 重磅消息-Service Fabric 正式开源

    微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source ,介绍了社区呼声最高的S ...

  8. FTP环境搭建及客户代码调用公共方法封装

    一.背景 大型系统架构往往被分解为多个独立可运行的组件, 以满足性能.可靠性.可扩展性的需求.多个组件间的数据交互往往采用两种方式:小量数据通过Sock函数.RMI.WebService等接口方式传递 ...

  9. redis3.0.7集群部署手册

    1.用root登录主机2.将redis-3.0.7.tar.gz传送到主机3.将rubygems-update-2.5.2.gem,redis-3.0.0.gem传送到主机4.解压redis-3.0. ...

  10. 树莓派centos安装的基本配置

    萌新再发一帖,这篇文章呢主要是为大家在树莓派上安装centos以后提供一个问题的解决方案. 首先我呢觉得好奇就在某宝上花了两百来块钱买了一套树莓派,很多人喜欢在树莓派上安装Debian,我呢更青睐用R ...