关于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. VMware下载安装及CentOS7下载安装

    我是在Windows10系统下,下载的VMware Workstation 12 1.下载虚拟机软件 安装包位置(里面有激活码):https://pan.baidu.com/s/1i5hn5lj 2. ...

  2. 第二篇:操纵MySQL数据库(2) - 基于ORM思想的SQLAlchemy库

    前言 本文讲解在Python语言中使用SQLAlchemy库操纵MySQL数据库的方法. 由于具体内容涉及较多,本文仅以插入及展示数据为例,更多内容请查阅有关文档. ORM ORM也即对象 - 关系映 ...

  3. Spring中的IOC和AOP是什么含义,他们在项目中起到什么作用,并举例说明?

    IOC:控制反转,是一种设计模式.一层哈尼是控制权的转移:由传统的在程序中控制并依赖转移到容器赖控制:第二是依赖注入:将相互以来的对象分离,在Spring配置文件中描述他们的依赖关系.他们的依赖关系只 ...

  4. Bzoj2337:[HNOI2011]XOR和路径

    题面 bzoj Sol 设\(f[i]\)表示\(i到n\)的路径权值某一位为\(1\)的期望 枚举每一位,高斯消元即可 不要问我为什么是\(i\ - \ n\)而不可以是\(1\ - \ i\) # ...

  5. Java数组的操作方法

    在JDKAPI中,我们可以看到java.util.Arrays类.因为是在util工具包下.所以,方法都是静态的 看看里面有哪些方法是我们平时工作中会使用到的(以 int[] 举例)? 1)binar ...

  6. 【Learning】带花树——一般图最大匹配

    一般图最大匹配--带花树 问题 ​ 给定一个图,求该图的最大匹配.即找到最多的边,使得每个点至多属于一条边. ​ 这个问题的退化版本就是二分图最大匹配. ​ 由于二分图中不存在奇环,偶环对最大匹配并无 ...

  7. kubernetes Auto Install Guide

    1.概念&架构 Kubernetes is an open-source system for automating deployment, scaling, and management o ...

  8. OSI模型和TCP/IP协议族(二)

    OSI模型中的各层 物理层 物理层(physical layer)协调通过物理媒体传送比特流时所需要的各种功能.物理层涉及到接口和传输媒体的机械和电器规约.它还定义了这些物理设备即接口为了实现传输必须 ...

  9. Android Screen Monito

    1.下载 Android Screen Monitor http://code.google.com/p/android-screen-monitor/ (1) 下載 ASM_2_40.zip 并解压 ...

  10. Java单例模式的5种实现方式

    1.饿汉式.不支持并发: package com.ou; //饿汉式 public class Singleton1 { private Singleton1() { } private static ...