黑马程序员之基础测试
如题:写一个集合,集合存放的是整形的数据。写一个帮助类,帮组类中有两个static方法,一个方法为从大到小的顺序排序,一个方法为从小到大的顺序排序。实现上述的代码。
刚一看觉得挺简单的,整两个静态方法然后返回一个相同类型的集合就行了。心里老觉得不对,多读了两遍后我的想法变了:“写一个集合,集合存放的是整形的数据。写一个帮助类,帮组类中有两个static方法”这前半段话没问题。“一个方法为从大到小的顺序排序,一个方法为从小到大的顺序排序”这段话就有新想法了,更改数据集合本身而方法没有返回值(这个在题目中隐藏的说法)如果可以有返回值的话就会说成“方法返回从大到小的顺序排序”而不是“为”了。
遇到问题先度娘,还真有人问,也有人回答,我为什么要在这里重写一下这个就是觉得网上的答案有点不对劲。
升序是自带的方法,而没有降序排序。因为刚开始调用的时候是引用传递,导致在写降序方法的时候,得到的降序集合只是个副本。找不到解决方案就打开源码中的sort排序方法看,一看才明白原来要用迭代器。不过又有了疑问:为什么从副本对象中得到的迭代器可以修改到原始地址里的值呢?度娘好像也没用了,查看帮助文档才发现:“
- 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
”,我认为这句话说的意思是:允许迭代期间移除Collection的某些元素。大家应该知道引用类型的改变通常是再创建一个存储空间存储新的值,然后把这个新地址给以前的变量。而这里说“移除”,我不知道它是又创建了一个存储空间把符合条件的数据放进去然后把地址给我,还是怎么的,我只能确定一点--迭代器可以得到你想要的集合。
代码如下:
View Code
1 /** 2 * 第9题:写一个集合,集合存放的是整形的数据。 写一个帮助类,帮组类中有两个static方法,一个方法为从大到小的顺序排序,一个方法为从小到大的顺序排序。 3 * 实现上述的代码。 4 * 5 */ 6 public class Test9 { 7 public static void main(String[] args) { 8 Integer[] num = new Integer[]{10,20,9,50,20,100}; 9 List<Integer> numList=Arrays.asList(num); 10 11 Helper.printArrayValue(numList); 12 Helper.sortOfASC(numList); 13 Helper.printArrayValue(numList); 14 Helper.sortOfDESC(numList); 15 Helper.printArrayValue(numList); 16 } 17 } 18 19 class Helper { 20 /** 21 * 对int数组参数进行降序排列 22 * 23 * @param args 24 */ 25 public static void sortOfDESC(List<Integer> args) { 26 ListIterator<Integer> li=args.listIterator();//得到迭代器 27 Collections.sort(args);//对集合进行升序排序 28 29 Object[] newArgs = args.toArray();//把原有集合中的数据进行存储 30 31 for (int i = args.size()-1; i >=0; i--) {//循环 32 li.next();//迭代 33 li.set((Integer)newArgs[i]);//更新数据 34 } 35 } 36 37 /** 38 * 对int数组参数进行升序排列 39 * 40 * @param args 41 */ 42 public static void sortOfASC(List<Integer> args) { 43 Collections.sort(args);//对集合进行升序排序 44 } 45 46 /** 47 * 顺序打印出int数组参数的所有成员 48 * 49 * @param args 50 * int数组 51 */ 52 public static void printArrayValue(List<Integer> args) { 53 for (int i = 0; i < args.size(); i++) { 54 System.out.print(args.get(i) + ","); 55 } 56 System.out.print("\n"); 57 } 58 }