首页 > 其他分享 >集合习题分数排序

集合习题分数排序

时间:2022-11-29 22:22:09浏览次数:56  
标签:分数 sort elements getScore list code Student 习题 排序

创建一个学生类,属性包括id[1-40],分数0-100,所有属性随机生成,创建set集合,保存20个对象,找到分数最高和分数最低的学生

private static void demo2() {
        //用treeset来做,需要提供比较器
        TreeSet<Student> students=
            new TreeSet<>(Comparator.comparing(Student::getScore));
        ThreadLocalRandom random=ThreadLocalRandom.current();//获取随机数实例
        //分数相同treeset会舍去,因此这里循环的终止点为它的长度为20
    while (students.size()<20){
      students.add(new Student(random.nextInt(20),random.nextInt(0,100)));
   }
    System.out.println(students.first()+" "+students.last());
        //但是上面做法会出现学生学号有重复值的情况,且treeset是比较慢的,我们换用下面的方法
        //用hashset来做,需要重写equals和hashcode保证元素的唯一性,但是分数是可以不用唯一的,因此只需要提供学号的重写
        Set<Student> hashSet=new HashSet<>();
        while (hashSet.size()<20){
            hashSet.add(new Student(random.nextInt(20),random.nextInt(0,100)));
        }
        hashSet.forEach(System.out::println);//id是唯一的
    //用集合的工具类来获取
        Collections.max(hashSet,Comparator.comparing(Student::getScore));
        Collections.min(hashSet,Comparator.comparing(Student::getScore));
        List<Student> collect = hashSet.parallelStream().sorted(Comparator.comparing(Student::getScore)).collect(Collectors.toList());//用stream来排序
        System.out.println(collect.get(0)+" "+collect.get(19));
    }

或者在学生类里面重写comparable接口里面的compareTo方法:

public class Student implements Comparable {
    private Integer id;
    private Integer score;

    @Override
    public int compareTo(Object student) {
        Student student1=(Student) student;
        return this.getScore()>student1.getScore()?1:(this.getScore()==student1.getScore())?0:-1;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;
        Student student = (Student) object;
        return Objects.equals(id, student.id) ;
    }

    @Override
    public int hashCode() {

        return Objects.hash(id);
    }
}

因为工具类里面的排序方法Collections.sort() 底层是这样说的:

/**
 * Sorts the specified list into ascending order, according to the
 * {@linkplain Comparable natural ordering} of its elements.
 * All elements in the list must implement the {@link Comparable}
 * interface.  Furthermore, all elements in the list must be
 * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)}
 * must not throw a {@code ClassCastException} for any elements
 * {@code e1} and {@code e2} in the list).
 *
 * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
 * not be reordered as a result of the sort.
 *
 * <p>The specified list must be modifiable, but need not be resizable.
 *
 * @implNote
 * This implementation defers to the {@link List#sort(Comparator)}
 * method using the specified list and a {@code null} comparator.
 *
 * @param  <T> the class of the objects in the list
 * @param  list the list to be sorted.
 * @throws ClassCastException if the list contains elements that are not
 *         <i>mutually comparable</i> (for example, strings and integers).
 * @throws UnsupportedOperationException if the specified list's
 *         list-iterator does not support the {@code set} operation.
 * @throws IllegalArgumentException (optional) if the implementation
 *         detects that the natural ordering of the list elements is
 *         found to violate the {@link Comparable} contract
 * @see List#sort(Comparator)
 */
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

标签:分数,sort,elements,getScore,list,code,Student,习题,排序
From: https://www.cnblogs.com/Liku-java/p/16936906.html

相关文章

  • java list根据对象的某个属性排序
    javalist根据对象的某个属性排序 Collections.sort(list1,newComparator<BlogRank>(){@Overridepublicintcompare(BlogRankblogRankObj1,BlogRa......
  • 归并排序模板
    归并排序模板归并排序要点:分治的思想确定分界点mid=(l+r)/2;递归排序left,right归并——合二为一(归并排序的核心)#include<bits/stdc++.h>usingnamespac......
  • 拓扑排序 专题
    拓扑排序(\(Topological\)\(sorting\))拓扑排序指的是有向无环图(\(DAG\));学过计算机网络的知道计算机网络中有一个拓扑结构;下面就是一个拓扑结构;那拓扑序就是,图中任意一......
  • Sequelize排序问题: 关联其他表数据的排序实现
    问题描述:有一对多或者多对多的关联表数据要一起提取返回前端时,在没有申明排序规则的情况下,关联的数据的顺序是随机的。在前端多次调用这类接口,会发现,页面展示的关联数据的......
  • 排序实练(1):列表排序-插入法及排序基础认知
    1.1插入法排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——​​插入排序法​......
  • 排序实练(2):列表排序-冒泡法/选择排序/快速排序
    ​​排序算法有很多,包括​​​​插入排序​​​,​​堆排序​​​,​​归并排序​​​,​​选择排序​​​,​​计数排序​​​,​​基数排序​​​,​​桶排序​​​,​​快速排序......
  • acwing113. 特殊排序
    记录交互题这个东西 classSolution{public:vector<int>specialSort(intN){vector<int>res;res.push_back(1);for(inti=2;i<......
  • 5.2.5 快速排序——代码解说
    需思考一个巧妙的办法,在这个数组里头,原地进行这个数组元素倒换,实现参照元素在它该到达的位置去存放,左边的元素都比它小,右边的元素都比它大,不分配动态数组。保证整体左边小,......
  • SQL常用日期格式化转换与百分数转换
    目录SQL将小数转为保留两位的百分数常用的日期格式化补充:秒/毫秒转为持续时间常用拼接方式:本篇开启数据库在工作中常用到的格式转换与工具,欢迎大家评论留言......
  • 5.2.1 归并排序——总体思路
    折半查找快速是因为每次只查一半,另一半不管把一个任务拆成两个部分只完成其中一部分,是一个很有效的办法当元素多了,运算、时间消耗等会比较复杂数组前一半让它有序,后一半......