Java使用LinkedHashMap进行分数排序

 更新时间:2021年05月25日 10:58:18   作者:doymm2008  
这篇文章主要介绍了Java使用LinkedHashMap进行分数排序的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

分数排序的特殊问题

在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代码实现双向链表

    java代码实现双向链表

    这篇文章主要为大家详细介绍了java代码实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java实现高并发秒杀的七种方式

    Java实现高并发秒杀的七种方式

    本文主要介绍了Java实现高并发秒杀的六种方式,包括使用缓存、数据库乐观锁、数据库悲观锁、分布式锁、队列限流、令牌桶算法和限流器,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • java发送javax.mail邮件实例讲解

    java发送javax.mail邮件实例讲解

    这篇文章主要为大家介绍了java发送javax.mail邮件实例讲解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Java语言中4种内部类的超详细讲解

    Java语言中4种内部类的超详细讲解

    这篇文章主要给大家介绍了关于Java语言中4种内部类的超详细讲解,内部类可以分为:实例内部类、静态内部类和成员内部类,每种内部类都有它特定的一些特点,文中介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 详解SpringMVC的拦截器参数及拦截器链配置

    详解SpringMVC的拦截器参数及拦截器链配置

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下
    2022-07-07
  • Java实现的猴子吃桃问题算法示例

    Java实现的猴子吃桃问题算法示例

    这篇文章主要介绍了Java实现的猴子吃桃问题算法,简单描述了猴子吃桃问题并结合实例形式给出了java解决猴子吃桃问题的具体实现技巧,需要的朋友可以参考下
    2017-10-10
  • Maven使用Nexus创建私服的实现

    Maven使用Nexus创建私服的实现

    本文主要介绍了Maven使用Nexus创建私服的实现,通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven,感兴趣的可以了解一下
    2024-04-04
  • Java加载JDBC驱动程序实例详解

    Java加载JDBC驱动程序实例详解

    这篇文章主要介绍了Java加载JDBC驱动程序的方法,需要的朋友可以参考下
    2014-07-07
  • Java Enum的简单使用

    Java Enum的简单使用

    这篇文章主要为大家详细介绍了Java Enum的简单使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • ElasticSearch添加索引代码实例解析

    ElasticSearch添加索引代码实例解析

    这篇文章主要介绍了ElasticSearch添加索引代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论