一道Java集合框架題 多種解題思路
問(wèn)題:某班30個(gè)學(xué)生的學(xué)號(hào)為20070301-20070330,全部選修了Java程序設(shè)計(jì)課程,給出所有同學(xué)的成績(jī)(可用隨機(jī)數(shù)產(chǎn)生,范圍60-100),請(qǐng)編寫程序?qū)⒈景喔魑煌瑢W(xué)的成績(jī)按照從低到高排序打印輸出。
要求:分別用List、Map、Set來(lái)實(shí)現(xiàn),打印的信息包括學(xué)號(hào)、姓名和成績(jī)。
1、使用List集合來(lái)實(shí)現(xiàn)
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實(shí)現(xiàn)
*
* 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), "同學(xué)"+j));
}
//ArrayList排序借助Collections中的sort()方法實(shí)現(xiàn)。
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), "同學(xué)"+j));
}
//對(duì)鏈表排序
Collections.sort(lt, new Sortbygrade());
//輸出鏈表
for(Student sd:lt)
System.out.println(sd);
}
}
//學(xué)生類
class Student{
int num,grade;
String name;
//構(gòu)造函數(shù)
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 "學(xué)號(hào):"+this.num+"\t"+"姓名:"+this.name+" "+"成績(jī):"+this.grade;
}
}
//創(chuàng)建一個(gè)比較器類
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;
}
}
輸出結(jié)果如圖:

對(duì)List集合框架的總結(jié):
1、List集合其實(shí)是一個(gè)動(dòng)態(tài)的數(shù)組,元素可以直接通過(guò)for循環(huán)取出,而不需要迭代。
2、輸出List集合時(shí),會(huì)默認(rèn)調(diào)用集合中存儲(chǔ)對(duì)象的toString()方法,所以在類中需要進(jìn)行覆寫。
若不覆寫toString( )方法,則必須使用
for(int i=0;i<lt.size();i++)
{
Student s=lt.get(i);
System.out.println("學(xué)號(hào):"+s.num+" 姓名:"+s.name+" 成績(jī):"+s.grade);
}
3、List集合的排序需要借助于Collections工具類,即Collections.Sort(list,new 比較器類())方法。所以需要自定義一個(gè)比較器類,定義自己的比較規(guī)則。
2、使用Set集合來(lái)實(shí)現(xiàn)
(1)使用TreeSet來(lái)實(shí)現(xiàn)
package com.package1;
import java.util.*;
public class StuScore {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<Student>(new Com());
//添加元素進(jìn)去
for(int i=20070301,j=1;i<=20070330;i++,j++)
{
ts.add(new Student(i,"同學(xué)"+j,(int) (40*Math.random()+60)));
}
//迭代循環(huán)取出
Iterator<Student> it=ts.iterator();
while(it.hasNext())
{
Student o1=it.next();
System.out.println("學(xué)號(hào):"+o1.num+" "+"姓名:"+o1.name+" "+" "+"成績(jī):"+o1.grade);
}
}
}
//學(xué)生類
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;
}
}
輸出結(jié)果為:
學(xué)號(hào):20070307 姓名:同學(xué)16 成績(jī):60
學(xué)號(hào):20070309 姓名:同學(xué)18 成績(jī):60
學(xué)號(hào):20070314 姓名:同學(xué)23 成績(jī):61
學(xué)號(hào):20070318 姓名:同學(xué)27 成績(jī):61
學(xué)號(hào):20070322 姓名:同學(xué)31 成績(jī):61
學(xué)號(hào):20070306 姓名:同學(xué)15 成績(jī):62
學(xué)號(hào):20070310 姓名:同學(xué)19 成績(jī):64
學(xué)號(hào):20070302 姓名:同學(xué)11 成績(jī):66
學(xué)號(hào):20070308 姓名:同學(xué)17 成績(jī):68
學(xué)號(hào):20070321 姓名:同學(xué)30 成績(jī):68
學(xué)號(hào):20070330 姓名:同學(xué)39 成績(jī):69
學(xué)號(hào):20070303 姓名:同學(xué)12 成績(jī):70
學(xué)號(hào):20070320 姓名:同學(xué)29 成績(jī):70
學(xué)號(hào):20070323 姓名:同學(xué)32 成績(jī):77
學(xué)號(hào):20070313 姓名:同學(xué)22 成績(jī):78
學(xué)號(hào):20070304 姓名:同學(xué)13 成績(jī):79
學(xué)號(hào):20070324 姓名:同學(xué)33 成績(jī):83
學(xué)號(hào):20070326 姓名:同學(xué)35 成績(jī):84
學(xué)號(hào):20070327 姓名:同學(xué)36 成績(jī):85
學(xué)號(hào):20070311 姓名:同學(xué)20 成績(jī):88
學(xué)號(hào):20070305 姓名:同學(xué)14 成績(jī):89
學(xué)號(hào):20070329 姓名:同學(xué)38 成績(jī):89
學(xué)號(hào):20070316 姓名:同學(xué)25 成績(jī):90
學(xué)號(hào):20070301 姓名:同學(xué)10 成績(jī):95
學(xué)號(hào):20070312 姓名:同學(xué)21 成績(jī):96
學(xué)號(hào):20070317 姓名:同學(xué)26 成績(jī):97
學(xué)號(hào):20070319 姓名:同學(xué)28 成績(jī):97
學(xué)號(hào):20070325 姓名:同學(xué)34 成績(jī):98
學(xué)號(hào):20070315 姓名:同學(xué)24 成績(jī):99
學(xué)號(hào):20070328 姓名:同學(xué)37 成績(jī):99
對(duì)TreeSet的總結(jié):
1、元素不可以重復(fù),而且TreeSet是有序的。
2、兩種排序方法:
(1)自定義一個(gè)比較器類,比如class Com implementsComparator{ } ,實(shí)現(xiàn)compare(Object o1, Object o2)方法,在其中定義比較規(guī)則。
(2)讓元素自身具備比較性。
步驟:將add進(jìn)TreeSet中的元素實(shí)現(xiàn)Comparable接口,并且覆蓋compareTo方法。這種順序也是元素的自然順序,或者叫做默認(rèn)順序。
方法1和方法2的區(qū)別:
兩種方法各有優(yōu)劣, 用Comparable 簡(jiǎn)單, 只要實(shí)現(xiàn)Comparable 接口的對(duì)象直接就成為一個(gè)可以比較的對(duì)象,但是需要修改源代碼。
用Comparator 的好處是不需要修改源代碼, 而是另外實(shí)現(xiàn)一個(gè)比較器, 當(dāng)某個(gè)自定義的對(duì)象需要作比較的時(shí)候,把比較器和對(duì)象一起傳遞過(guò)去就可以比大小了, 并且在Comparator 里面用戶可以自己實(shí)現(xiàn)復(fù)雜的可以通用的邏輯,使其可以匹配一些比較簡(jiǎn)單的對(duì)象,那樣就可以節(jié)省很多重復(fù)勞動(dòng)了。
(2)使用HashSet來(lái)實(shí)現(xiàn)
package com.package1;
import java.util.*;
public class StuScore {
public static void main(String[] args) {
HashSet<Student> hs=new HashSet<Student>();
//添加元素進(jìn)去
for(int i=20070301,j=1;i<=20070330;i++,j++)
{
hs.add(new Student(i,"同學(xué)"+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);
}
}
//學(xué)生類
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 "學(xué)號(hào):"+this.num+"\t"+"姓名:"+this.name
+" "+"成績(jī):"+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;
}
}
輸出結(jié)果如下:
學(xué)號(hào):20070310 姓名:同學(xué)19 成績(jī):60
學(xué)號(hào):20070330 姓名:同學(xué)39 成績(jī):62
學(xué)號(hào):20070326 姓名:同學(xué)35 成績(jī):63
學(xué)號(hào):20070317 姓名:同學(xué)26 成績(jī):64
學(xué)號(hào):20070318 姓名:同學(xué)27 成績(jī):65
學(xué)號(hào):20070322 姓名:同學(xué)31 成績(jī):65
學(xué)號(hào):20070301 姓名:同學(xué)10 成績(jī):67
學(xué)號(hào):20070328 姓名:同學(xué)37 成績(jī):68
學(xué)號(hào):20070304 姓名:同學(xué)13 成績(jī):68
學(xué)號(hào):20070319 姓名:同學(xué)28 成績(jī):69
學(xué)號(hào):20070313 姓名:同學(xué)22 成績(jī):70
學(xué)號(hào):20070303 姓名:同學(xué)12 成績(jī):71
學(xué)號(hào):20070312 姓名:同學(xué)21 成績(jī):71
學(xué)號(hào):20070329 姓名:同學(xué)38 成績(jī):72
學(xué)號(hào):20070306 姓名:同學(xué)15 成績(jī):72
學(xué)號(hào):20070324 姓名:同學(xué)33 成績(jī):72
學(xué)號(hào):20070305 姓名:同學(xué)14 成績(jī):75
學(xué)號(hào):20070315 姓名:同學(xué)24 成績(jī):75
學(xué)號(hào):20070314 姓名:同學(xué)23 成績(jī):78
學(xué)號(hào):20070307 姓名:同學(xué)16 成績(jī):80
學(xué)號(hào):20070311 姓名:同學(xué)20 成績(jī):81
學(xué)號(hào):20070302 姓名:同學(xué)11 成績(jī):83
學(xué)號(hào):20070309 姓名:同學(xué)18 成績(jī):84
學(xué)號(hào):20070320 姓名:同學(xué)29 成績(jī):85
學(xué)號(hào):20070321 姓名:同學(xué)30 成績(jī):85
學(xué)號(hào):20070316 姓名:同學(xué)25 成績(jī):86
學(xué)號(hào):20070327 姓名:同學(xué)36 成績(jī):90
學(xué)號(hào):20070308 姓名:同學(xué)17 成績(jī):94
學(xué)號(hào):20070323 姓名:同學(xué)32 成績(jī):94
學(xué)號(hào):20070325 姓名:同學(xué)34 成績(jī):95
對(duì)HashSet的總結(jié):
1、HashSet中的元素不可以重復(fù),如果重復(fù)添加,則只會(huì)顯示一個(gè)。
原理如下:
HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的。不同步。
2、HashSet是如何保證元素唯一性的呢?
答:是通過(guò)元素的兩個(gè)方法,hashCode和equals來(lái)完成。
如果元素的HashCode值相同,才會(huì)判斷equals是否為true。如果元素的hashcode值不同,不會(huì)調(diào)用equals。
3、對(duì)HashSet的排序,通過(guò)將Set集合轉(zhuǎn)化為L(zhǎng)ist集合,借助Collections.Sort( )方法實(shí)現(xiàn)排序。
3、使用TreeMap來(lái)實(shí)現(xiàn)
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.創(chuàng)建集合
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、往集合對(duì)象中添加元素
tm.put(new Student(grade,"同學(xué)"+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("學(xué)號(hào):"+num+" "+"姓名:"+key.name+" "+"成績(jī):"+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)
{ //當(dāng)成績(jī)相同時(shí),按照姓名排序
return this.name.compareTo(o.name);
}
return -1;
}
}
輸出結(jié)果為:
學(xué)號(hào):20070303 姓名:同學(xué)12 成績(jī):61
學(xué)號(hào):20070323 姓名:同學(xué)32 成績(jī):61
學(xué)號(hào):20070317 姓名:同學(xué)26 成績(jī):62
學(xué)號(hào):20070309 姓名:同學(xué)18 成績(jī):64
學(xué)號(hào):20070301 姓名:同學(xué)10 成績(jī):67
學(xué)號(hào):20070304 姓名:同學(xué)13 成績(jī):69
學(xué)號(hào):20070322 姓名:同學(xué)31 成績(jī):69
學(xué)號(hào):20070328 姓名:同學(xué)37 成績(jī):70
學(xué)號(hào):20070305 姓名:同學(xué)14 成績(jī):71
學(xué)號(hào):20070319 姓名:同學(xué)28 成績(jī):73
學(xué)號(hào):20070321 姓名:同學(xué)30 成績(jī):74
學(xué)號(hào):20070310 姓名:同學(xué)19 成績(jī):81
學(xué)號(hào):20070315 姓名:同學(xué)24 成績(jī):82
學(xué)號(hào):20070307 姓名:同學(xué)16 成績(jī):84
學(xué)號(hào):20070330 姓名:同學(xué)39 成績(jī):84
學(xué)號(hào):20070312 姓名:同學(xué)21 成績(jī):85
學(xué)號(hào):20070324 姓名:同學(xué)33 成績(jī):87
學(xué)號(hào):20070306 姓名:同學(xué)15 成績(jī):88
學(xué)號(hào):20070308 姓名:同學(xué)17 成績(jī):90
學(xué)號(hào):20070327 姓名:同學(xué)36 成績(jī):90
學(xué)號(hào):20070318 姓名:同學(xué)27 成績(jī):91
學(xué)號(hào):20070316 姓名:同學(xué)25 成績(jī):92
學(xué)號(hào):20070320 姓名:同學(xué)29 成績(jī):92
學(xué)號(hào):20070314 姓名:同學(xué)23 成績(jī):93
學(xué)號(hào):20070313 姓名:同學(xué)22 成績(jī):94
學(xué)號(hào):20070302 姓名:同學(xué)11 成績(jī):95
學(xué)號(hào):20070325 姓名:同學(xué)34 成績(jī):95
學(xué)號(hào):20070329 姓名:同學(xué)38 成績(jī):97
學(xué)號(hào):20070326 姓名:同學(xué)35 成績(jī):98
學(xué)號(hào):20070311 姓名:同學(xué)20 成績(jī):99
對(duì)TreeMap的總結(jié):
1、TreeMap默認(rèn)對(duì)key進(jìn)行排序,所以可將自定義對(duì)象放入key中,將代表學(xué)號(hào)的整型放入value中。對(duì)Key排序時(shí),可以指定自定義對(duì)象中的某個(gè)屬性來(lái)排序。
2、Map集合使用put()方法添加元素。
3、Map集合的取出原理:將map集合轉(zhuǎn)成set集合。在通過(guò)迭代器取出。map集合的兩種取出方式:
(1)Set<k> keySet:將map中所有的鍵存入到Set集合。因?yàn)閟et具備迭代器。所有可以迭代方式取出所有的鍵,在根據(jù)get方法。獲取每一個(gè)鍵對(duì)應(yīng)的值。
(2)Set<Map.Entry<k,v>> entrySet:將map集合中的映射關(guān)系存入到了set集合中,而這個(gè)關(guān)系的數(shù)據(jù)類型就是:Map.Entry
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JAVA集合框架工具類自定義Collections集合方法
- 簡(jiǎn)單了解java集合框架LinkedList使用方法
- Java集合框架迭代器Iterator實(shí)現(xiàn)原理解析
- Java集合框架Collections原理及用法實(shí)例
- JAVA集合框架Map特性及實(shí)例解析
- 通過(guò)實(shí)例學(xué)習(xí)Java集合框架HashSet
- Java集合框架源碼分析之LinkedHashMap詳解
- Java集合框架LinkedList詳解及實(shí)例
- Java集合框架中迭代器Iterator解析
- java集合框架詳解
- Java集合框架之Collection接口詳解
- Java基礎(chǔ)詳解之集合框架工具Collections
相關(guān)文章
Linux(centos7)安裝jdk1.8的詳細(xì)步驟
Linux的使用相信大家都要用到j(luò)ava吧,在使用java前我們得先安裝jdk以及配置環(huán)境變量等工作,下面這篇文章主要給大家介紹了關(guān)于Linux(centos7)安裝jdk1.8的詳細(xì)步驟,需要的朋友可以參考下2023-10-10
SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
idea插件篇之java內(nèi)存分析工具(JProfiler)的使用
這篇文章主要介紹了idea插件篇之java內(nèi)存分析工具(JProfiler),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java?11新特性HttpClient主要組件及發(fā)送請(qǐng)求示例詳解
這篇文章主要為大家介紹了java?11新特性HttpClient主要組件及發(fā)送請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

