摘要:本文将带你了解Java语言之集合框架题,希望本文对大家学JAVA有所帮助。
问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。
要求:分别用List、Map、Set来实现,打印的信息包括学号、姓名和成绩。
1、使用List集合来实现 [java] view plain copy 1. import java.util.ArrayList; 2. import java.util.Collections; 3. import java.util.Comparator; 4. import java.util.Iterator; 5. import java.util.LinkedList; 6. import java.util.TreeMap; 7. 8. 9. 10. public class Test2{ 11. 12. public static void main(String[] args){ 13. 14. /* 此处用ArrayList实现 15. * 16. * ArrayList<Student>al=new ArrayList<Student>(); 17. for(int i=20070301,j=10;i<=20070330;i++,j++) 18. { 19. al.add(new Student(i,(int) (40*Math.random()+60), "同学"+j)); 20. } 21. 22. //ArrayList排序借助Collections中的sort()方法实现。 23. Collections.sort(al, new Sortbygrade()); 24. for(Student sd:al) 25. System.out.println(sd); 26. 27. */ 28. 29. LinkedList<Student> lt=new LinkedList<Student>(); 30. for(int i=20070301,j=10;i<=20070330;i++,j++) 31. { 32. lt.add(new Student(i,(int) (40*Math.random()+60), "同学"+j)); 33. } 34. 35. //对链表排序 36. Collections.sort(lt, new Sortbygrade()); 37. //输出链表 38. for(Student sd:lt) 39. System.out.println(sd); 40. 41. } 42. 43. } 44. 45. 46. 47. //学生类 48. class Student{ 49. int num,grade; 50. String name; 51. 52. //构造函数 53. public Student(int num,int grade,String name){ 54. 55. this.num=num; 56. this.name=name; 57. this.grade=grade; 58. } 59. 60. //此处必须覆写 61. public String toString(){ 62. // System.out.println("hi"); 63. return "学号:"+this.num+"\t"+"姓名:"+this.name+" "+"成绩:"+this.grade; 64. } 65. 66. } 67. 68. //创建一个比较器类 69. class Sortbygrade implements Comparator<Student>{ 70. 71. @Override 72. public int compare(Student s1, Student s2) { 73. 74. if(s1.grade>s2.grade) 75. return 1; 76. if(s1.grade<s2.grade) 77. return -1; 78. if(s1.grade==s2.grade) 79. return s1.name.compareTo(s2.name); 80. return 0; 81. 82. } 83. 84. } 输出结果如图: 对List集合框架的总结: 1、List集合其实是一个动态的数组,元素可以直接通过for循环取出,而不需要迭代。 2、输出List集合时,会默认调用集合中存储对象的toString()方法,所以在类中需要进行覆写。 若不覆写toString( )方法,则必须使用 [java] view plain copy 1. for(int i=0;i<lt.size();i++) 2. { 3. Student s=lt.get(i); 4. System.out.println("学号:"+s.num+" 姓名:"+s.name+" 成绩:"+s.grade); 5. } 3、List集合的排序需要借助于Collections工具类,即Collections.Sort(list,new 比较器类())方法。所以需要自定义一个比较器类,定义自己的比较规则。 2、使用Set集合来实现 (1)使用TreeSet来实现 [java] view plain copy 1. package com.package1; 2. 3. import java.util.*; 4. 5. public class StuScore { 6. 7. public static void main(String[] args) { 8. 9. TreeSet<Student> ts=new TreeSet<Student>(new Com()); 10. //添加元素进去 11. for(int i=20070301,j=1;i<=20070330;i++,j++) 12. { 13. ts.add(new Student(i,"同学"+j,(int) (40*Math.random()+60))); 14. } 15. 16. //迭代循环取出 17. Iterator<Student> it=ts.iterator(); 18. while(it.hasNext()) 19. { 20. Student o1=it.next(); 21. System.out.println("学号:"+o1.num+" "+"姓名:"+o1.name+" "+" "+"成绩:"+o1.grade); 22. 23. } 24. 25. } 26. } 27. //学生类 28. class Student 29. { 30. int num; 31. int grade; 32. String name; 33. 34. 35. public Student(int num, String name,int grade) 36. { 37. this.num=num; 38. this.name=name; 39. this.grade=grade; 40. } 41. } 42. class Com implements Comparator 43. { 44. 45. @Override 46. public int compare(Object o1, Object o2) { 47. 48. Student s1=(Student) o1; 49. Student s2=(Student) o2; 50. if(s1.grade>s2.grade) 51. return 1; 52. if(s1.grade<s2.grade) 53. return -1; 54. if(s1.grade==s2.grade) 55. { 56. return new Integer(s1.num).compareTo(new Integer(s2.num)); 57. } 58. return 0; 59. } 60. } 输出结果为: 学号:20070307 姓名:同学16 成绩:60 学号:20070309 姓名:同学18 成绩:60 学号:20070314 姓名:同学23 成绩:61 学号:20070318 姓名:同学27 成绩:61 学号:20070322 姓名:同学31 成绩:61 学号:20070306 姓名:同学15 成绩:62 学号:20070310 姓名:同学19 成绩:64 学号:20070302 姓名:同学11 成绩:66 学号:20070308 姓名:同学17 成绩:68 学号:20070321 姓名:同学30 成绩:68 学号:20070330 姓名:同学39 成绩:69 学号:20070303 姓名:同学12 成绩:70 学号:20070320 姓名:同学29 成绩:70 学号:20070323 姓名:同学32 成绩:77 学号:20070313 姓名:同学22 成绩:78 学号:20070304 姓名:同学13 成绩:79 学号:20070324 姓名:同学33 成绩:83 学号:20070326 姓名:同学35 成绩:84 学号:20070327 姓名:同学36 成绩:85 学号:20070311 姓名:同学20 成绩:88 学号:20070305 姓名:同学14 成绩:89 学号:20070329 姓名:同学38 成绩:89 学号:20070316 姓名:同学25 成绩:90 学号:20070301 姓名:同学10 成绩:95 学号:20070312 姓名:同学21 成绩:96 学号:20070317 姓名:同学26 成绩:97 学号:20070319 姓名:同学28 成绩:97 学号:20070325 姓名:同学34 成绩:98 学号:20070315 姓名:同学24 成绩:99 学号:20070328 姓名:同学37 成绩:99 对TreeSet的总结: 1、元素不可以重复,而且TreeSet是有序的。 2、两种排序方法: (1)自定义一个比较器类,比如class Com implementsComparator{ } ,实现compare(Object o1, Object o2)方法,在其中定义比较规则。 (2)让元素自身具备比较性。 步骤:将add进TreeSet中的元素实现Comparable接口,并且覆盖compareTo方法。这种顺序也是元素的自然顺序,或者叫做默认顺序。 方法1和方法2的区别: 两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。 (2)使用HashSet来实现 [java] view plain copy 1. package com.package1; 2. 3. import java.util.*; 4. 5. 6. 7. 8. public class StuScore { 9. 10. public static void main(String[] args) { 11. 12. HashSet<Student> hs=new HashSet<Student>(); 13. //添加元素进去 14. for(int i=20070301,j=1;i<=20070330;i++,j++) 15. { 16. 17. hs.add(new Student(i,"同学"+j,(int) 18. 19. (40*Math.random()+60))); 20. } 21. 22. ArrayList<Student>li=new ArrayList(hs); 23. 24. Collections.sort(li, new Sortbygrade()); 25. 26. for(Student ss:li) 27. System.out.println(ss); 28. 29. 30. } 31. 32. } 33. //学生类 34. class Student 35. { 36. int num; 37. int grade; 38. String name; 39. 40. 41. public Student(int num, String name, int grade) 42. { 43. this.num=num; 44. this.name=name; 45. this.grade=grade; 46. } 47. public String toString(){ 48. //System.out.println("hi"); 49. return "学号:"+this.num+"\t"+"姓名:"+this.name 50. 51. +" "+"成绩:"+this.grade; 52. } 53. 54. 55. } 56. 57. 58. class Sortbygrade implements Comparator{ 59. 60. @Override 61. public int compare(Object o1, Object o2) { 62. 63. Student s1=(Student) o1; 64. Student s2=(Student) o2; 65. if(s1.grade>s2.grade) 66. return 1; 67. if(s1.grade<s2.grade) 68. return -1; 69. // if(s1.grade==s2.grade) 70. 71. return 0; 72. } 73. 74. } 输出结果如下: 学号:20070310 姓名:同学19 成绩:60 学号:20070330 姓名:同学39 成绩:62 学号:20070326 姓名:同学35 成绩:63 学号:20070317 姓名:同学26 成绩:64 学号:20070318 姓名:同学27 成绩:65 学号:20070322 姓名:同学31 成绩:65 学号:20070301 姓名:同学10 成绩:67 学号:20070328 姓名:同学37 成绩:68 学号:20070304 姓名:同学13 成绩:68 学号:20070319 姓名:同学28 成绩:69 学号:20070313 姓名:同学22 成绩:70 学号:20070303 姓名:同学12 成绩:71 学号:20070312 姓名:同学21 成绩:71 学号:20070329 姓名:同学38 成绩:72 学号:20070306 姓名:同学15 成绩:72 学号:20070324 姓名:同学33 成绩:72 学号:20070305 姓名:同学14 成绩:75 学号:20070315 姓名:同学24 成绩:75 学号:20070314 姓名:同学23 成绩:78 学号:20070307 姓名:同学16 成绩:80 学号:20070311 姓名:同学20 成绩:81 学号:20070302 姓名:同学11 成绩:83 学号:20070309 姓名:同学18 成绩:84 学号:20070320 姓名:同学29 成绩:85 学号:20070321 姓名:同学30 成绩:85 学号:20070316 姓名:同学25 成绩:86 学号:20070327 姓名:同学36 成绩:90 学号:20070308 姓名:同学17 成绩:94 学号:20070323 姓名:同学32 成绩:94 学号:20070325 姓名:同学34 成绩:95 对HashSet的总结: 1、HashSet中的元素不可以重复,如果重复添加,则只会显示一个。 原理如下: HashSet:底层数据结构是哈希表。是线程不安全的。不同步。 2、HashSet是如何保证元素唯一性的呢? 答:是通过元素的两个方法,hashCode和equals来完成。 如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。 3、对HashSet的排序,通过将Set集合转化为List集合,借助Collections.Sort( )方法实现排序。 3、使用TreeMap来实现 [java] view plain copy 1. package com.package1; 2. 3. 4. 5. import java.util.Comparator; 6. import java.util.Iterator; 7. import java.util.Set; 8. import java.util.TreeMap; 9. 10. public class TestTreeMap { 11. 12. public static void main(String[] args) { 13. //1.创建集合 14. TreeMap<Student,Integer> tm=new TreeMap<Student,Integer>(); 15. for(int i=20070301,j=10;i<=20070330;i++,j++) 16. { 17. int grade=(int) (40*Math.random()+60); 18. //2、往集合对象中添加元素 19. tm.put(new Student(grade,"同学"+j),i); 20. } 21. 22. //3.遍历集合 ,排序完成 23. Set<Student> k=tm.keySet(); 24. Iterator<Student> it=k.iterator(); 25. 26. while(it.hasNext()){ 27. Student key=it.next(); 28. Integer num=tm.get(key); 29. 30. System.out.println("学号:"+num+" "+"姓名:"+key.name+" "+"成绩:"+key.grade); 31. } 32. } 33. 34. } 35. 36. class Student implements Comparable<Student>{ 37. int grade; 38. String name; 39. 40. public Student(int grade,String name){ 41. this.grade =grade; 42. this.name=name; 43. } 44. 45. @Override 46. public int compareTo(Student o) { 47. 48. if(this.grade>o.grade) 49. return 1; 50. if(this.grade==o.grade) 51. { //当成绩相同时,按照姓名排序 52. return this.name.compareTo(o.name); 53. } 54. return -1; 55. 56. } 57. 58. 59. 60. }
输出结果为:
学号:20070303 姓名:同学12 成绩:61
学号:20070323 姓名:同学32 成绩:61
学号:20070317 姓名:同学26 成绩:62
学号:20070309 姓名:同学18 成绩:64
学号:20070301 姓名:同学10 成绩:67
学号:20070304 姓名:同学13 成绩:69
学号:20070322 姓名:同学31 成绩:69
学号:20070328 姓名:同学37 成绩:70
学号:20070305 姓名:同学14 成绩:71
学号:20070319 姓名:同学28 成绩:73
学号:20070321 姓名:同学30 成绩:74
学号:20070310 姓名:同学19 成绩:81
学号:20070315 姓名:同学24 成绩:82
学号:20070307 姓名:同学16 成绩:84
学号:20070330 姓名:同学39 成绩:84
学号:20070312 姓名:同学21 成绩:85
学号:20070324 姓名:同学33 成绩:87
学号:20070306 姓名:同学15 成绩:88
学号:20070308 姓名:同学17 成绩:90
学号:20070327 姓名:同学36 成绩:90
学号:20070318 姓名:同学27 成绩:91
学号:20070316 姓名:同学25 成绩:92
学号:20070320 姓名:同学29 成绩:92
学号:20070314 姓名:同学23 成绩:93
学号:20070313 姓名:同学22 成绩:94
学号:20070302 姓名:同学11 成绩:95
学号:20070325 姓名:同学34 成绩:95
学号:20070329 姓名:同学38 成绩:97
学号:20070326 姓名:同学35 成绩:98
学号:20070311 姓名:同学20 成绩:99
对TreeMap的总结:
1、TreeMap默认对key进行排序,所以可将自定义对象放入key中,将代表学号的整型放入value中。对Key排序时,可以指定自定义对象中的某个属性来排序。
2、Map集合使用put()方法添加元素。
3、Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
map集合的两种取出方式:
(1)Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
(2)Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry
以上就介绍了JAVA的相关知识,希望对JAVA有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言JAVA频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号