tamako tamako
首页
  • Mysql
  • Redis
  • JVM
  • 个人开源项目 (opens new window)
  • 开源官网 (opens new window)
  • B站主页 (opens new window)
  • 摄影
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

tamako | 玉子

胜人者有力,自胜者强
首页
  • Mysql
  • Redis
  • JVM
  • 个人开源项目 (opens new window)
  • 开源官网 (opens new window)
  • B站主页 (opens new window)
  • 摄影
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 自定义的比较器

    • Comparable
      • Comparator
      pruedream
      2024-02-18
      随笔
      目录

      自定义的比较器

      # 自定义的比较器

      java有两种方式实现比较器

      比较器出现的原因是:为了解决对象之间的比较问题。

      两个比较器的比较规则都是一样的,下面在此处声明一下:

      (o1,o2)方法的参数中o1 是在o2前的

      方法的返回值为负数或0不交换,为正数才交换

      举个例子,假设方法内部是 return o1-o2; 就是升序,因为o1在o2前面,假如入o1大于o2,结果为正数,正数要交换o1与o2的顺序,也就是把大的元素放到了后面,即升序。反之o2大于o1的话,结果为负数,不交换,也是升序

      # Comparable

      Comparable称为内部比较器,因为我们创建需要排序的类还要实现这个类,在创建之初就要人工规定好了排序方式。

      实现这个类,然后我们需要重写他的compareTo方法,传递一个类进入,与当前本身类进行比较,返回值是一个int类型。

      比较规则是:如果本身 - 传入 > 0,且返回的是正数,那么就是按照升序排列,如果返回的是负数,就是按照降序排列。也可以看成return a-b是升序,return b-a是降序。

      如果调用compare方法大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的升序了。如果小于等于0,那么就不会交换了。

      java复制代码import java.util.*;
      public class Test {
      	public static void main(String[] args) {
      		
      		MySort m1 = new MySort();
      		MySort m2 = new MySort();
      		m1.setId(10);
      		m2.setId(8);
      
      		LinkedList<MySort> list = new LinkedList<>();
      		list.add(m1);
      		list.add(m2);
      
      		System.out.println(list.get(0).getId() + " ");
      		System.out.println(list.get(1).getId());
      		Collections.sort(list);
      		System.out.println(list.get(0).getId() + " ");
      		System.out.println(list.get(1).getId());
      	}
      
      class MySort implements Comparable<MySort> {
      	private String name;
      	private int id;
      	
      	public void setName(String name) {
      		this.name = name;
      	}
      	
      	public String getName() {
      		return name;
      	}
      	
      	public void setId(int id) {
      		this.id = id;
      	}
      	
      	public int getId() {
      		return id;
      	}
      	
      	@Override
      	public int compareTo(MySort o) {
              // 按照升序排序,低->高
      		if (id - o.id > 0) {
      			return 1;
      		} else if (id - o.id == 0) {
      			return 0;
      		} else {
      			return -1;
      		}
      	}
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52

      # Comparator

      Comparator称为外部比较器,因为Comparator可以脱离所需要比较的类,比如要对没有实现Comparable的类进行比较,存在List中,这时候如果要排序的话,可以在Collections.sort() 中传入一个Comparator比较器,重写该比较器的compare方法即可。

      java复制代码import java.util.*;
      public class Test {
      	public static void main(String[] args) {
      		MySort m1 = new MySort();
      		MySort m2 = new MySort();
      		m1.setId(10);
      		m2.setId(8);
      
      		LinkedList<MySort> list = new LinkedList<>();
      		list.add(m1);
      		list.add(m2);
      
      		System.out.print(list.get(0).getId() + " ");
      		System.out.println(list.get(1).getId());
      		Collections.sort(list, new Comparator<MySort>() {
      			@Override
      			public int compare(MySort o1, MySort o2) {
      				if (o1.getId() - o2.getId() > 0) {
      					return 1;
      				} else if (o1.getId() - o2.getId() == 0) {
      					return 0;
      				} else {
      					return -1;
      				}
      			}
      		});
      		System.out.print(list.get(0).getId() + " ");
      		System.out.println(list.get(1).getId());
      	}
      }
      
      class MySort {
      	private String name;
      	private int id;
      	
      	public void setName(String name) {
      		this.name = name;
      	}
      	
      	public String getName() {
      		return name;
      	}
      	
      	public void setId(int id) {
      		this.id = id;
      	}
      	
      	public int getId() {
      		return id;
      	}
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      上次更新: 2024/08/09, 16:07:34
      最近更新
      01
      骄惰怯
      08-10
      02
      谦虚谦虚谦虚
      08-09
      03
      长期主义
      07-17
      更多文章>
      Theme by Vdoing | Copyright © 2019-2024 tamako | MIT License
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式