Java语言之集合框架题
白羽 2018-07-09 来源 :网络 阅读 799 评论 0

摘要:本文将带你了解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频道!



本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程