• java自带排序的使用


    参考:https://blog.csdn.net/wudiyong22/article/details/47357833

    示例:

    基本类型排序:
    int a[]={1,2,5,3,6,4};
    Arrays.sort(a);//对a升序排序
    Arrays.sort(a,0,6);//对a从下标0,到下标5排序
    
    
    自定义类型排序:
    static Student b[]=new Student [4];
    for(int i=0;i<4;++i)b[i]=new Student("str", 4-i);
    Arrays.sort(b,new Mcompeter());//对数组所有元素排序,Comparator可以用实例,也可以匿名对象
    Arrays.sort(b,0,4,new Mcompeter());//对数组从下标0到3排序
    
    static class Student {
    		   public String name;
    		   public int age;
    		   
    		   public Student(String name,int age){
    		      this.name = name;
    		      this.age = age;
    		   }
    		   
    		   public String toString() {
    			   return "Student [name=" + name + ", age=" + age + "]";
    		   }
    }
    static class Mcompeter implements Comparator<Student> 
    	{
    		@Override
    		public int compare(Student o1, Student o2) {
    			// TODO 自动生成的方法存根
    			if(o1.name.compareTo(o2.name)==0)
    			{
    				return o1.age-o2.age;
    			}
    			else return o1.name.compareTo(o2.name);
    		}
    	}
    

    测试代码:

    import java.util.*;
    
    public class Main
    {
    	static int n,q,l,r,x,a[]={2,1,5,3,6,4};
    	static Student b[]=new Student [4];
    	
    	public static void main(String []args)
    	{
    		Scanner sc=new Scanner(System.in);
    		Arrays.sort(a,0,6);
    		for(int i=0;i<a.length;++i)
    		System.out.print(a[i]+" ");
    		System.out.println();
    		for(int i=0;i<4;++i)
    		{
    			b[i]=new Student("str", 4-i);
    		}
    		Arrays.sort(b,new Mcompeter());//对数组所有元素排序,Comparator可以用实例,也可以匿名对象
    		Arrays.sort(b,0,4,new Mcompeter());//对数组从下标0到3排序
    		for(int i=0;i<b.length;++i)
    			System.out.println(b[i]);
    	}
    	
    	static class Mcompeter implements Comparator<Student> 
    	{
    		@Override
    		public int compare(Student o1, Student o2) {
    			// TODO 自动生成的方法存根
    			if(o1.name.compareTo(o2.name)==0)
    			{
    				return o1.age-o2.age;
    			}
    			else return o1.name.compareTo(o2.name);
    		}
    	}
    	static class Student {
    
    		   public String name;
    
    		   public int age;
    
    		   public Student(String name,int age){
    
    		      this.name = name;
    
    		      this.age = age;
    
    		   }
    		   public String toString() {
    			   return "Student [name=" + name + ", age=" + age + "]";
    		   }
    		   
    
    	}
    }
    
    

    在这里插入图片描述

    比较函数的写法

    参考:https://blog.csdn.net/weixin_41922289/article/details/90463971

    比较逻辑:

    o1 < o2 ---- 返回负数
    o1 = o2 ---- 返回 0
    o1 > o2 ---- 返回正数

    人都绕晕了。。。

    理一下思路:
    排序函数默认从小到大排序
    那么怎么界定谁大谁小呢,给排序函数一个比较函数

    那么比较函数已经有两个参数了,怎么表示o1,o2的大小关系呢?
    就是逻辑如下:

    o1  <  o2   ---- 返回负数
    o1  =  o2   ---- 返回 0
    o1  >  o2   ---- 返回正数
    

    返回负数表示o1<o2
    返回0 表示相等
    返回正数表示o1>o2


    要把排序函数和比较函数分离开
    他们是独立实现功能的函数,只要保证他们自己的正确即可

    写比较函数需要做的就是:

    在o1<o2时返回负数
    在o1=o2时返回0
    在o1>o2时返回整数

    再直接一点:
    o1在前时返回负数
    在o1=o2时返回0
    o1在后时返回整数

    其中的"<"和“>”不一定是真实数值意义上的小于和大于,而是你希望的小于和大于。

    比如o1 o2都为int

    if(o1>o2) return -1;

    那么o1的值比o2大就是我定义的“小于”


    sort 和优先队列 默认顺序(升序降序:java同c++)

    默认优先级只对不加comparator或者比较函数的情况适用,加了比较函数,那么排序就完全按照比较函数来确定,这时候同一个比较函数对sort和优先队列是一样的顺序。就记住一句话:(返回负数就是o1(a)在前)
    (c++就是返回true就o1在前)
    参考:https://blog.csdn.net/qq_43868654/article/details/115053059

  • 相关阅读:
    Atitit. C#.net clr 2.0 4.0 4.5新特性 v2 s22 1. CLR内部结构 1 2. CLR 版本发展史 3 3. CLR 2.0新特性 4 4. CLR 4 新特性
    Hbase基本命令 悟寰轩
    mvn常用命令 悟寰轩
    linux添加tomcat服务 悟寰轩
    hadoop基本命令 悟寰轩
    Tomcat启动 悟寰轩
    Eclipse自动部署项目到Tomcat的webapps下的有效方法 悟寰轩
    MySQL改变默认编码为utf8 悟寰轩
    myeclipse关闭自动更新 悟寰轩
    Linux命令大全 悟寰轩
  • 原文地址:https://www.cnblogs.com/m2364532/p/16901668.html
Copyright © 2020-2023  润新知