Java使用LinkedHashMap進行分?jǐn)?shù)排序
分?jǐn)?shù)排序的特殊問題
在java中實現(xiàn)排序遠比C/C++簡單,我們只要讓集合中元素對應(yīng)的類實現(xiàn)Comparable接口,然后調(diào)用Collections.sort();方法即可.
這種方法對于排序存在許多相同元素的情況有些浪費,明顯即使值相等,兩個元素之間也要比較一下,這在現(xiàn)實中是沒有意義的.
典型例子就是學(xué)生成績統(tǒng)計的問題,例如高考中,滿分是150,成千上萬的學(xué)生成績都在0-150之間,平均一個分?jǐn)?shù)的人數(shù)成百上千,這時如果排序還用傳統(tǒng)方法明顯就浪費了.
進一步思考
成績既然有固定的分?jǐn)?shù)等級,我們可以把相同等級的成績放在一起,以100分為滿分計,共分一百個等級,來一個成績就歸入固定的檔,要得到排序結(jié)果時可以從低檔取到高檔,取出來自然就是排序的結(jié)果.
接下來是確定數(shù)據(jù)結(jié)構(gòu)的問題,檔次-學(xué)生群這樣的自然是key-value結(jié)構(gòu),但Map中的Hashtable和HashMap都不能保持插入時的順序,雖然我們可以從固定的檔次取名單,但這樣略嫌不方便,我們需要更好的數(shù)據(jù)結(jié)構(gòu),它既以鍵值的形式存儲數(shù)據(jù),又能保持插入時的順序.
LinkedHashMap橫空出世
LinkedHashMap正是這樣一個數(shù)據(jù)結(jié)構(gòu),它”在HashMap的基礎(chǔ)上增加了一個雙向鏈表,由此LinkedHashMap既能以哈希表的形式存儲數(shù)據(jù),又能保持查詢時的順序.”
下頁就是進行排序用的類,它在構(gòu)造實例時先創(chuàng)建好分?jǐn)?shù)檔次,加入學(xué)生成績時自動歸檔,要取出排序的學(xué)生的成績時只要按檔次輸出即可.
ScoreSorter類
輔助類Student
package com.junglesong;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Student implements Comparable{
private String name;
private int score;
public Student(String name,int score){
this.name=name;
this.score=score;
}
public int compareTo(Object obj){
Student another=(Student)obj;
return this.score-another.score;
}
public String toString(){
return "學(xué)生姓名="+name+" 分?jǐn)?shù)="+score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public static void main(String[] args){
//-----------老排序方案-----------
/*TimeTest oldSortTest=new TimeTest();
List<Student> scores=new ArrayList<Student>();
Random random=new Random();
for(int i=0;i<100000;i++){
scores.add(new Student("學(xué)生"+i,random.nextInt(100)));
}
Collections.sort(scores);
//for(Student student:scores){
// System.out.println(student);
//}
oldSortTest.end("老排序方案耗時");*/
//-----------新排序方案-----------
TimeTest newSortTest=new TimeTest();
ScoreSorter sorter2=new ScoreSorter(100);
Random random=new Random();
for(int i=0;i<1000;i++){
sorter2.addStudent(new Student("學(xué)生"+i,random.nextInt(100)));
}
List<Student> ls=sorter2.getSortedScores();
//for(Student student:sorter2.getSortedScores()){
// System.out.println(student);
//}
newSortTest.end("新排序方案耗時");
}
}
與傳統(tǒng)排序方案的比較
在元素個數(shù)遠超等級個數(shù)即相同的元素很多時,這種方案在速度上稍高于傳統(tǒng)方案,節(jié)省的時間主要在不比較同等級元素上.
這種方案能夠按檔次取出數(shù)據(jù),這種優(yōu)勢是傳統(tǒng)排序方案缺乏的.
傳統(tǒng)方案普適性比此方案強.
源碼:scoresorter
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot接入deepseek深度求索示例代碼(jdk1.8)
這篇文章主要介紹了SpringBoot接入deepseek深度求索的相關(guān)資料,包括建API?key、封裝詢問Deepseek的工具方法(在配置文件中添加key值)、調(diào)用測試并確保端口一致例如8091,最后運行結(jié)果,需要的朋友可以參考下2025-02-02
Java實現(xiàn)Excel導(dǎo)入導(dǎo)出的步驟詳解
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)Excel的導(dǎo)入、導(dǎo)出,文中示例代碼介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴們可以參考一下2023-06-06
SpringBoot連接Hive實現(xiàn)自助取數(shù)的示例
這篇文章主要介紹了SpringBoot連接Hive實現(xiàn)自助取數(shù)的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12
解決@Autowired報錯Could not autowire. No bea
介紹了在IDEA中使用@Autowired報錯Couldnot autowire. No beans of 'XXX' type found的解決方法,原因是@Autowired在注入service時,由于service接口沒有實現(xiàn)類,而mybatis僅需提供Dao接口,導(dǎo)致@Autowired無法識別2024-12-12

