Java使用LinkedHashMap进行分数排序

发布时间 - 2026-01-11 01:07:24    点击率:

分数排序的特殊问题

在java中实现排序远比C/C++简单,我们只要让集合中元素对应的类实现Comparable接口,然后调用Collections.sort();方法即可.
这种方法对于排序存在许多相同元素的情况有些浪费,明显即使值相等,两个元素之间也要比较一下,这在现实中是没有意义的.
典型例子就是学生成绩统计的问题,例如高考中,满分是150,成千上万的学生成绩都在0-150之间,平均一个分数的人数成百上千,这时如果排序还用传统方法明显就浪费了.

进一步思考

成绩既然有固定的分数等级,我们可以把相同等级的成绩放在一起,以100分为满分计,共分一百个等级,来一个成绩就归入固定的档,要得到排序结果时可以从低档取到高档,取出来自然就是排序的结果.
接下来是确定数据结构的问题,档次-学生群这样的自然是key-value结构,但Map中的Hashtable和HashMap都不能保持插入时的顺序,虽然我们可以从固定的档次取名单,但这样略嫌不方便,我们需要更好的数据结构,它既以键值的形式存储数据,又能保持插入时的顺序.

LinkedHashMap横空出世

LinkedHashMap正是这样一个数据结构,它”在HashMap的基础上增加了一个双向链表,由此LinkedHashMap既能以哈希表的形式存储数据,又能保持查询时的顺序.”
下页就是进行排序用的类,它在构造实例时先创建好分数档次,加入学生成绩时自动归档,要取出排序的学生的成绩时只要按档次输出即可.

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 "学生姓名="+name+" 分数="+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("学生"+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("学生"+i,random.nextInt(100)));
    }
    
   List<Student> ls=sorter2.getSortedScores();
    //for(Student student:sorter2.getSortedScores()){
    //  System.out.println(student);
    //}
    newSortTest.end("新排序方案耗时");  
  }
}

与传统排序方案的比较

在元素个数远超等级个数即相同的元素很多时,这种方案在速度上稍高于传统方案,节省的时间主要在不比较同等级元素上.
这种方案能够按档次取出数据,这种优势是传统排序方案缺乏的.
传统方案普适性比此方案强.

源码:scoresorter

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java  # LinkedHashMap  # 排序  # Java中LinkedHashMap源码解析  # Java集合框架源码分析之LinkedHashMap详解  # 详解Java中LinkedHashMap  # java HashMap  # TreeMap与LinkedHashMap的详解  # Java有序的Map LinkedHashMap用法详解  # 数据结构  # 我们可以  # 又能  # 都在  # 也要  # 成百上千  # 基础上  # 这样一个  # 要让  # 要得  # 这在  # 它在  # 下页  # 还用  # 共分  # 远比  # 既能  # 大家多多  # 键值  # 一百个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Python文件异常处理策略_健壮性说明【指导】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何生成URL和重定向?(路由助手函数)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  javascript中闭包概念与用法深入理解  Android自定义listview布局实现上拉加载下拉刷新功能  轻松掌握MySQL函数中的last_insert_id()  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  linux top下的 minerd 木马清除方法  开心动漫网站制作软件下载,十分开心动画为何停播?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何快速生成可下载的建站源码工具?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何在万网利用已有域名快速建站?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何在万网开始建站?分步指南解析  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Swift中循环语句中的转移语句 break 和 continue  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  怎么用AI帮你设计一套个性化的手机App图标?  如何自定义建站之星模板颜色并下载新样式?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  C#如何调用原生C++ COM对象详解  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何用西部建站助手快速创建专业网站?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  EditPlus中的正则表达式 实战(4)  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在万网自助建站平台快速创建网站?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel如何创建自定义中间件?(Middleware代码示例)