关于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. template.process(root, out)的用法(shiro项目中来的九)

    Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8" ...

  2. 如何使用jQuery-ContextMenu实现右击菜单

    最近在做项目中,遇到一个棘手的问题,页面上有很多功能需要实现,每个功能需要绑定一个按钮.如果一个功能绑定一个按钮,那么将会占用页面很大的空间,而且可能会使页面变得不美观.思前想后,决定将所有按钮做成右 ...

  3. C#图解教程 第十章 结构

    结构 什么是结构结构是值类型对结构赋值构造函数和析构函数 实例构造函数静态构造函数构造函数和析构函数小结 字段初始化语句是不允许的结构是密封的装箱和拆箱结构作为返回值和参数 关于结构的其他信息 结构 ...

  4. jquery 记住账号 记住密码

    <body> <label><input type="checkbox" onclick="loginBtn_user()" /& ...

  5. RobotFramework自动化测试框架-移动手机自动化测试Open Application关键字的使用

    在AppiumLibrary库中,Open Application关键字用来打开一个待测试移动APP. 示例1:连接本机已经打开的appium服务端,打开一个待测试的安卓APP,指定测试平台为Andr ...

  6. Keras官方中文文档:关于Keras模型

    关于Keras模型 Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况. 两类模型有一些方法是相同的: ...

  7. [JZOJ5511] 送你一个DAG

    题目描述: 给出一个 \(n\) 个点 \(m\) 条边的 \(DAG\) 和参数 \(k\). 定义一条经过 \(l\) 条边的路径的权值为 \(l^k\). 对于 \(i = 1-n\), 求出所 ...

  8. 【BZOJ2588】Count On a Tree(主席树)

    [BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...

  9. .NET Core使用skiasharp文字头像生成方案(基于docker发布)

    一.问题背景 目前.NET Core下面针对于图像处理的库微软并没有集成,在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理,到了.NET Core下一脸 ...

  10. 未来已来,腾讯AI计算网络

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:由鹅厂网事发表在云+社区 "鹅厂网事"由深圳市腾讯计算机系统有限公司技术工程事业群网络平台部运营,我们希望与业界各位志同道合的伙伴交流 ...