zoukankan      html  css  js  c++  java
  • 《Java 程序设计》课堂实践项目 课后学习总结

    《Java 程序设计》课堂实践项目 课后学习总结

    String类的使用(sort)

    目录

    Linux命令(sort)

    『sort』:sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

    • 语法:sort(选项)(参数)
    • 常用选项:
      • -b:忽略每行前面开始出的空格字符;
      • -c:检查文件是否已经按照顺序排序;
      • -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
      • -f:排序时,将小写字母视为大写字母;
      • -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
      • -k:排序时,指定本域的开头和结尾;
      • -m:将几个排序号的文件进行合并;
      • -M:将前面3个字母依照月份的缩写进行排序;
      • **-n:依照数值的大小排序; **
      • -o<输出文件>:将排序后的结果存入制定的文件;
      • -r:以相反的顺序来排序;
      • -t<分隔字符>:指定排序时所用的栏位分隔字符;
      • +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
    • 参数:指定待排序的文件列表。
    • 注意:使用-k +<起始栏位>-<结束栏位>这一命令时,若“只”根据本域的第n个字符进行排序,则使用-k n,n

    返回目录

    课堂实践

    任务如下:

    模拟实现Linux下Sort -t : -k 2的功能。参考 Sort的实现。

    import java.util.*;
    
    public class MySort1 {
        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);
    
            Arrays.sort(toSort);
    
            System.out.println("After sort:");
            for( String str : toSort)
                System.out.println(str);
        }
    }
    

    老师给出的范例调用了java.util.Arrays.sort()方法,查阅API文档可以看到sort()的使用方法如下:

    我们只需要将切割和判断输出的部分补充上去即可。

    需要注意以下两点:

    • 数组下标从0开始,所以第2列为array[1]。
    • 我们的目标是按照数值大小进行sort,而查阅API文档可以看到,调用split()方法的返回值String[],是字符串数组。所以我们需要调用Integer.parseInt()方法进行转换。

    所以,补充的“切割”部分的代码为:

    Integer [] tmp = new Integer [toSort.length];
            for(int i=0; i<tmp.length; i++)
                tmp[i] = new Integer(Integer.parseInt(toSort[i].split(":")[3]));
    

    “按序输出”部分的代码为:

    for(int i=0; i<tmp.length; i++)
                for(int j=0; j<toSort.length; j++)
                    if(Integer.parseInt(toSort[j].split(":")[3]) == tmp[i].intValue())
                        System.out.println(toSort[j]);
    

    附:码云链接
    返回目录

    课后思考

    课堂上给出的题目比较简单,但课下补充学习时遇到了很多问题,现将我的思考总结如下。

    学习老师的代码之后的思考:int与Integer

    注意到老师在博客中给出了一行这样的代码:Integer [] tmp = new Integer [toSort.length];,而我的代码是int [] tmp = new int [toSort.length];,int与Integer各自的用法是什么呢?

    这个内容之前在课本上学习过,我们知道Integer类型的对象包含一个int类型的字段。趁着这个机会再深入了解两者的区别。

    通过API文档可以了解到,Integer类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。如果需要调用Integer类的方法,查阅API文档即可。

    来看下面几行代码:

    int i = 128;
    Integer i2 = 128;
    Integer i3 = new Integer(128);
    
    System.out.println(i == i2);
    System.out.println(i == i3);
    

    打印值均为true,因为Integer会自动拆箱为int,值相等。

    Integer i5 = 127;
    Integer i6 = 127;
    System.out.println(i5 == i6);
    

    这段代码结果也为true,这很好理解。但下面这段代码:

    Integer i5 = 128;
    Integer i6 = 128;
    System.out.println(i5 == i6);
    

    为什么结果为false呢?java在编译Integer i5 = 127的时候,被翻译成Integer i5 = Integer.valueOf(127),查看valueOf()函数的源码:

    public static Integer valueOf(int i) {
    	assert IntegerCache.high >= 127;
    	if (i >= IntegerCache.low && i <= IntegerCache.high)
    		return IntegerCache.cache[i + (-IntegerCache.low)];
    	return new Integer(i);
    }
    

    对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。

    此外,int的默认值为0,而Integer的默认值为null,这也是两者的区别之一。

    java.util.Arrays类与java.util.Collections类中的sort()方法实现

    老师课堂上讲的代码使用了java.util.Arrays类的sort()方法,查询API文档我们可以看到,java.util.Collections类中也有sort()方法。

    那么,课堂实践的题目如果使用Collections类的sort()方法该如何实现呢?

    参考Arrays类sort()方法的使用,首先需要定义一个对象,用来储存切割后参考其值进行排序的那一列:List<String> tmp1 = new ArrayList();,ArrayList类有一个add()方法可以实现。add()方法可以将指定的元素添加到此列表的尾部,打印出来是数组的形式(ArrayList其实就是动态数组)。所以“切割”部分的代码为:

    List<String> tmp1 = new ArrayList();
            for(int i = 0; i < toSort.length; i++){
                tmp1.add(toSort[i].split(":")[1]);
            }
    

    API显示,Collections类的sort()方法需要传入ArrayList类的一个对象,所以Collections.sort(tmp1);即可。

    判断输出的时候要注意,按照之前的思路,需要遍历原数组,而定义的tmp1不是数组,更不会有tmp1[i]这种形式了。所以需要调用ArrayList类的toArray()方法,返回包含此列表中所有元素的数组。这样一来,就能够遍历并输出了。

    “按序输出”部分的代码如下:

    for(int i = 0; i < tmp1.size(); i++)
                for(int j = 0; j < toSort.size(); j++){
                    if(toSort[j].split(":")[1].equals(tmp1.toArray()[i]) )
                        System.out.println(toSort[j]);
                }
    

    返回目录

    学习反思及总结

    • 最近几天压力很大,学习状态也很差,常常感到焦灼浮躁。思考原因,大概可以总结为:深刻认识到了现实与理想的差距。书越读越厚,知识也越学越多,细细想来每一科的学习都浮在表面,与自己的要求相差甚远。但临近期末,没有充裕的时间让我一点一点补充知识的漏洞,所以才会感到烦躁不安吧。
    • 真正的勇者不会羞于承认自己的不足,既然意识到了差距的存在,就要想办法一点一点赶上。我认为我最缺乏的就是动手能力,以本学期的课程为例,我并没有将数据结构、密码学等等课程的学习与实践充分结合,更不要提用编程解决实际问题了。虽然考试的重点在于理论知识,但付诸实践解决问题才是学习知识的根本目的。
    • 时间还很多,机会也很多。就当下而言,把眼前的事做好才是王道。最后,非常感谢娄老师的开导与指点,每次与老师交谈都能收获满满的动力~

    返回目录

  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/Vivian517/p/6838171.html
Copyright © 2011-2022 走看看