问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。
要求:分别用List、Map、Set来实现,打印的信息包括学号、姓名和成绩。
1、使用List集合来实现
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; import java.util.TreeMap; public class Test2{ public static void main(String[] args){ /* 此处用ArrayList实现 * * ArrayList<Student>al=new ArrayList<Student>(); for(int i=20070301,j=10;i<=20070330;i++,j++) { al.add(new Student(i,(int) (40*Math.random()+60), "同学"+j)); } //ArrayList排序借助Collections中的sort()方法实现。 Collections.sort(al, new Sortbygrade()); for(Student sd:al) System.out.println(sd); */ LinkedList<Student> lt=new LinkedList<Student>(); for(int i=20070301,j=10;i<=20070330;i++,j++) { lt.add(new Student(i,(int) (40*Math.random()+60), "同学"+j)); } //对链表排序 Collections.sort(lt, new Sortbygrade()); //输出链表 for(Student sd:lt) System.out.println(sd); } } //学生类 class Student{ int num,grade; String name; //构造函数 public Student(int num,int grade,String name){ this.num=num; this.name=name; this.grade=grade; } //此处必须覆写 public String toString(){ // System.out.println("hi"); return "学号:"+this.num+"\t"+"姓名:"+this.name+" "+"成绩:"+this.grade; } } //创建一个比较器类 class Sortbygrade implements Comparator<Student>{ @Override public int compare(Student s1, Student s2) { if(s1.grade>s2.grade) return 1; if(s1.grade<s2.grade) return -1; if(s1.grade==s2.grade) return s1.name.compareTo(s2.name); return 0; } }
输出结果如图:
对List集合框架的总结:
1、List集合其实是一个动态的数组,元素可以直接通过for循环取出,而不需要迭代。
2、输出List集合时,会默认调用集合中存储对象的toString()方法,所以在类中需要进行覆写。
若不覆写toString( )方法,则必须使用
for(int i=0;i<lt.size();i++) { Student s=lt.get(i); System.out.println("学号:"+s.num+" 姓名:"+s.name+" 成绩:"+s.grade); }
3、List集合的排序需要借助于Collections工具类,即Collections.Sort(list,new 比较器类())方法。所以需要自定义一个比较器类,定义自己的比较规则。
2、使用Set集合来实现
(1)使用TreeSet来实现
package com.package1; import java.util.*; public class StuScore { public static void main(String[] args) { TreeSet<Student> ts=new TreeSet<Student>(new Com()); //添加元素进去 for(int i=20070301,j=1;i<=20070330;i++,j++) { ts.add(new Student(i,"同学"+j,(int) (40*Math.random()+60))); } //迭代循环取出 Iterator<Student> it=ts.iterator(); while(it.hasNext()) { Student o1=it.next(); System.out.println("学号:"+o1.num+" "+"姓名:"+o1.name+" "+" "+"成绩:"+o1.grade); } } } //学生类 class Student { int num; int grade; String name; public Student(int num, String name,int grade) { this.num=num; this.name=name; this.grade=grade; } } class Com implements Comparator { @Override public int compare(Object o1, Object o2) { Student s1=(Student) o1; Student s2=(Student) o2; if(s1.grade>s2.grade) return 1; if(s1.grade<s2.grade) return -1; if(s1.grade==s2.grade) { return new Integer(s1.num).compareTo(new Integer(s2.num)); } return 0; } }
输出结果为:
学号: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来实现
package com.package1; import java.util.*; public class StuScore { public static void main(String[] args) { HashSet<Student> hs=new HashSet<Student>(); //添加元素进去 for(int i=20070301,j=1;i<=20070330;i++,j++) { hs.add(new Student(i,"同学"+j,(int) (40*Math.random()+60))); } ArrayList<Student>li=new ArrayList(hs); Collections.sort(li, new Sortbygrade()); for(Student ss:li) System.out.println(ss); } } //学生类 class Student { int num; int grade; String name; public Student(int num, String name, int grade) { this.num=num; this.name=name; this.grade=grade; } public String toString(){ //System.out.println("hi"); return "学号:"+this.num+"\t"+"姓名:"+this.name +" "+"成绩:"+this.grade; } } class Sortbygrade implements Comparator{ @Override public int compare(Object o1, Object o2) { Student s1=(Student) o1; Student s2=(Student) o2; if(s1.grade>s2.grade) return 1; if(s1.grade<s2.grade) return -1; // if(s1.grade==s2.grade) return 0; } }
输出结果如下:
学号: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来实现
package com.package1; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TestTreeMap { public static void main(String[] args) { //1.创建集合 TreeMap<Student,Integer> tm=new TreeMap<Student,Integer>(); for(int i=20070301,j=10;i<=20070330;i++,j++) { int grade=(int) (40*Math.random()+60); //2、往集合对象中添加元素 tm.put(new Student(grade,"同学"+j),i); } //3.遍历集合 ,排序完成 Set<Student> k=tm.keySet(); Iterator<Student> it=k.iterator(); while(it.hasNext()){ Student key=it.next(); Integer num=tm.get(key); System.out.println("学号:"+num+" "+"姓名:"+key.name+" "+"成绩:"+key.grade); } } } class Student implements Comparable<Student>{ int grade; String name; public Student(int grade,String name){ this.grade =grade; this.name=name; } @Override public int compareTo(Student o) { if(this.grade>o.grade) return 1; if(this.grade==o.grade) { //当成绩相同时,按照姓名排序 return this.name.compareTo(o.name); } return -1; } }
输出结果为:
學號:20070303 姓名:同學12 成績:61
學號:20070323 姓名:同學32 成績:61
學號:20070177 0070309 姓名:同學18 成績:64
學編號:20070301 姓名:同學10 成績:67
學號:20070304 姓名:同學13 成績:69
學號:200703222031 8 姓名:同學37 成績:70
學號: 20070305 姓名:同學14 成績:71
學號:20070319 姓名:同學28 成績:73 姓名:同學19 成績:81
學號:20070315 姓名:同學24 成績:82
學號:20070307 姓名:同學16 成績:84
學號:20070330 姓名:同學 成績:85
學號:20070324 姓名:同學33 成績:87
學號:20070306 姓名:同學15 成績:88
學號:20070308 成績:90
學號:20070318 姓名:同學27 成績:91
學號:20070316 姓名:學生25 成績:92
學號:20070320 姓名:同學 號:20070313 姓名:同學22 成績:94
學號:20070302 姓名:同學11 成績:95
學號:20070325 姓名:同學34 成績:95
學號:2007032 同學 0070326 姓名:同學35 成績:98
學編號:20070311 姓名:同學20 成績:99
對TreeMap的總結:
1、TreeMap預設對key進行排序,所以可將自訂物件放入key中,將代表學號的整數放入value中。對Key排序時,可以指定自訂物件中的某個屬性來排序。
2、Map集合使用put()方法加入元素。
3、Map集合的取出原理:將map集合轉成set集合。在通過迭代器取出。 map集合的兩種取出方式:
(1)Set
(2)Set
以上就是本文的全部內容,希望對大家的學習有幫助,也希望大家多多支持PHP中文網。
更多一道Java集合框架題 多種解題思路相關文章請關注PHP中文網!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

本文解釋了用於構建分佈式應用程序的Java的遠程方法調用(RMI)。 它詳細介紹了接口定義,實現,註冊表設置和客戶端調用,以解決網絡問題和安全性等挑戰。

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

本文詳細介紹了創建自定義Java網絡協議。 它涵蓋協議定義(數據結構,框架,錯誤處理,版本控制),實現(使用插座),數據序列化和最佳實踐(效率,安全性,維護


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

WebStorm Mac版
好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)