分?jǐn)?shù)排序的特殊問(wèn)題

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了叢臺(tái)免費(fèi)建站歡迎大家使用!
在java中實(shí)現(xiàn)排序遠(yuǎn)比C/C++簡(jiǎn)單,我們只要讓集合中元素對(duì)應(yīng)的類實(shí)現(xiàn)Comparable接口,然后調(diào)用Collections.sort();方法即可.
這種方法對(duì)于排序存在許多相同元素的情況有些浪費(fèi),明顯即使值相等,兩個(gè)元素之間也要比較一下,這在現(xiàn)實(shí)中是沒(méi)有意義的.
典型例子就是學(xué)生成績(jī)統(tǒng)計(jì)的問(wèn)題,例如高考中,滿分是150,成千上萬(wàn)的學(xué)生成績(jī)都在0-150之間,平均一個(gè)分?jǐn)?shù)的人數(shù)成百上千,這時(shí)如果排序還用傳統(tǒng)方法明顯就浪費(fèi)了.
進(jìn)一步思考
成績(jī)既然有固定的分?jǐn)?shù)等級(jí),我們可以把相同等級(jí)的成績(jī)放在一起,以100分為滿分計(jì),共分一百個(gè)等級(jí),來(lái)一個(gè)成績(jī)就歸入固定的檔,要得到排序結(jié)果時(shí)可以從低檔取到高檔,取出來(lái)自然就是排序的結(jié)果.
接下來(lái)是確定數(shù)據(jù)結(jié)構(gòu)的問(wèn)題,檔次-學(xué)生群這樣的自然是key-value結(jié)構(gòu),但Map中的Hashtable和HashMap都不能保持插入時(shí)的順序,雖然我們可以從固定的檔次取名單,但這樣略嫌不方便,我們需要更好的數(shù)據(jù)結(jié)構(gòu),它既以鍵值的形式存儲(chǔ)數(shù)據(jù),又能保持插入時(shí)的順序.
LinkedHashMap橫空出世
LinkedHashMap正是這樣一個(gè)數(shù)據(jù)結(jié)構(gòu),它”在HashMap的基礎(chǔ)上增加了一個(gè)雙向鏈表,由此LinkedHashMap既能以哈希表的形式存儲(chǔ)數(shù)據(jù),又能保持查詢時(shí)的順序.”
下頁(yè)就是進(jìn)行排序用的類,它在構(gòu)造實(shí)例時(shí)先創(chuàng)建好分?jǐn)?shù)檔次,加入學(xué)生成績(jī)時(shí)自動(dòng)歸檔,要取出排序的學(xué)生的成績(jī)時(shí)只要按檔次輸出即可.
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("老排序方案耗時(shí)");*/
//-----------新排序方案-----------
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("新排序方案耗時(shí)");
}
}
與傳統(tǒng)排序方案的比較
在元素個(gè)數(shù)遠(yuǎn)超等級(jí)個(gè)數(shù)即相同的元素很多時(shí),這種方案在速度上稍高于傳統(tǒng)方案,節(jié)省的時(shí)間主要在不比較同等級(jí)元素上.
這種方案能夠按檔次取出數(shù)據(jù),這種優(yōu)勢(shì)是傳統(tǒng)排序方案缺乏的.
傳統(tǒng)方案普適性比此方案強(qiáng).
源碼:scoresorter
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站名稱:Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
標(biāo)題來(lái)源:http://chinadenli.net/article20/ipjijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、域名注冊(cè)、做網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)