Java集合题

问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。

     要求:分别用List、Map、Set来实现,打印的信息包括学号、姓名和成绩。


1、使用List集合来实现

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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<Student>al=new ArrayList<Student>();  
  15. //      for(int i=20070301,j=10;i<=20070330;i++,j++)  
  16. //      {  
  17. //          al.add(new Student(i,(int) (40*Math.random()+60), "同学"+j));  
  18. //      }  
  19. //        
  20. //      //ArrayList排序借助Collections中的sort()方法实现。  
  21. //      Collections.sort(al, new Sortbygrade());  
  22. //      for(Student sd:al)  
  23. //      System.out.println(sd);  
  24.           
  25.         LinkedList<Student> lt=new LinkedList<Student>();  
  26.         for(int i=20070301,j=10;i<=20070330;i++,j++)  
  27.         {  
  28.             lt.add(new Student(i,(int) (40*Math.random()+60), "同学"+j));  
  29.         }  
  30.           
  31.         //对链表排序  
  32.         Collections.sort(lt, new Sortbygrade());  
  33.         //输出链表  
  34.         for(Student sd:lt)  
  35.             System.out.println(sd);  
  36.           
  37.     }  
  38.       
  39. }  
  40.   
  41.   
  42.   
  43. //学生类  
  44. class Student{  
  45.     int num,grade;  
  46.     String name;  
  47.       
  48.     //构造函数  
  49.     public Student(int num,int grade,String name){  
  50.           
  51.         this.num=num;  
  52.         this.name=name;  
  53.         this.grade=grade;  
  54.     }  
  55.       
  56.     //此处必须覆写  
  57.     public String toString(){  
  58. //      System.out.println("hi");  
  59.         return "学号:"+this.num+"\t"+"姓名:"+this.name+"    "+"成绩:"+this.grade;  
  60.     }  
  61.       
  62. }  
  63.   
  64. //创建一个比较器类  
  65. class Sortbygrade implements Comparator{  
  66.   
  67.     @Override  
  68.     public int compare(Object o1, Object o2) {  
  69.           
  70.         Student s1=(Student) o1;  
  71.         Student s2=(Student) o2;  
  72.         if(s1.grade>s2.grade)  
  73.             return 1;  
  74.         if(s1.grade<s2.grade)  
  75.             return -1;  
  76.         if(s1.grade==s2.grade)  
  77.             return s1.name.compareTo(s2.name);  
  78.         return 0;  
  79.     }  
  80.       
  81. }  


输出结果如图:




对List集合框架的总结:


1、List集合其实是一个动态的数组,元素可以直接通过for循环取出,而不需要迭代。

2、输出List集合时,会默认调用集合中存储对象的toString()方法,所以在类中需要进行覆写。

若不覆写toString( )方法,则必须使用

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值