命令行输入参数,并实现排序
命令行输入参数,并实现排序
实验要求:
用Java语言实现,从命令行输入几个数,实现排序并输出。
代码实现
- 码云链接
- 核心代码
- 实验结果
- 代码分析
- 首先,要实现从命令行输入参数,首先想到利用Integer。通过一个for循环,不停地将数组args[]中的字符串转换为数值,并赋值给一个同样int[]类型的数组x。实现从命令行将参数传入。
- 然后,利用双层循环的冒泡排序算法,实现数组x[]的值从小到大排序
- 最后,将已经排完序的数组x[]输出
实验过程中遇到的问题及解决
1、输入参数后,不出结果
- 问题举例:
如上,无论输入几个值,都提示有数组索引超出界限的异常。 - 分析:
问题出在输出语句上,语句如下:
for (String i : args) {
System.out.print(i + " ");
}
System.out.println();
该种表达是遍历args[]并输出值,但是args仅为一个字符串,命令行输入的参数转换为数值后被赋予了其他变量,而此输出依然是对该字符串进行的操作,因此是没有值空间的。无论输入几个值都会出现索引值超出界限的异常。
这一点从i的类型“String”也可以看出,它并不是数值,因此根本输出不了。
- 解决:
将字符串通过Integer转换为数值并赋值于一个数组x,并最终输出数组x[]的值。
即,最终输出的循环条件为:for (int i : x)
2、输出结果,但是无排序的原序列
- 问题举例:
如图,输入值2 1 5 3,输出结果仍未2 1 5 3,并未进行排序。 - 分析:
查看代码,发现有以下问题:
说明:红色框内表示的是排序比对过程,但是进行比对交换的仅仅为k、p的值,他们仅仅是被赋值args[i]的变量,而非指向数组地址的指针,因此交换k、p并不影响数组args[]的值顺序。所以,输出数组args[]会出现如上错误。 - 解决:
定义一个int[]类型的数组x,并将命令行输入的值赋值给它,然后比对交换数组x[]即可,最后输出的当然也是x[]。这样输出的便是排序之后的顺序。
3、输出结果后面跟一串0
- 问题举例:
如上图,输出结果是正常排序之后的,但是后面却有一串0 - 分析:
查看代码,输出部分如下:
它相当于:
for (int i = 0; i < x.length; i++) {
System.out.println(x[i]);
}
由此分析,循环条件是x数组的个数,但是题目中定义x时,空间为10个,因此输出个数也为10个,没有数值的用0补齐。
- 解决:
将循环终止条件将x.length改为args.length,这样输入个数为几个,就循环几次。
学到了什么
通过这次实验,首先温习了排序算法的运用;然后巩固了如何从命令行传入参数。
感悟和体会
题目可以说非常简单,但实践过程却用了大量时间查找错误。其实一直都在很低级的错误上纠结,这点可以看得出,还是练得少,即使知道要用的知识点,但是运用的却不熟练。总结了一下有两点原因:平时总是依赖于网络,很多简单的代码块在网上比比皆是,自己敲代码时经常为了图快,就直接拿来使用;调错时也是直接去网上搜索方法,而非自己想一想为什么。所以对一些越是简单的越磕绊,还需要将强熟练度,勤动手,并学着将遇到的错误整理、总结并牢记于心。