关于java中比较器Comparator的一些理解

在使用Java自带的排序函数时,往往需要根据自己的需求自定义比较器。**当我们使用Arrays.sort()方法时,这个方法默认是只能对一维数组进行排序的,而如果我们要对二维数组进行排序,就需要重写其中的比较器方法。**以前一直对Comparator的升序降序疑惑。现在记录一下,加深下印象。

先给结论:

实现Comparator接口,必须实现下面这个函数:

@Override
public int compare(CommentVo o1, CommentVo o2) {
           return o1.getTime().compareTo(o2.getTime());
}

这里o1表示位于前面的对象,o2表示后面的对象

  • 返回-1(或负数),表示不需要交换01和02的位置,o1排在o2前面,asc
  • 返回1(或正数),表示需要交换01和02的位置,o1排在o2后面,desc

举例说明:(分析说明在运行结果之后)

package com.zhb.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class A {
    int a;

    public A(int a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "[a=" + a + "]";
    }

}

class MyComparator implements Comparator<A> {

    @Override
    public int compare(A o1, A o2) {
        //升序
        //return o1.a - o2.a;
        //降序:后面会具体分析为什么降序
        return o2.a - o1.a;
    }

}

public class ComparatorTest {

    public static void main(String[] args) {
        A a1 = new A(5);
        A a2 = new A(7);
        List<A> list = new ArrayList<A>();
        list.add(a1);
        list.add(a2);
        Collections.sort(list, new MyComparator());
        System.out.println(list);
    }

}

输出结果:

img

下面来用我们之前的结论解释为什么return o2.a - o1.a;就是降序了:

首先o2是第二个元素,o1是第一个元素。无非就以下这些情况:
①: o2.a > o1.a : 那么此时返回正数,表示需要调整o1,o2的顺序,也就是需要把o2放到o1前面,这不就是降序了么。

②:o2.a < o1.a : 那么此时返回负数,表示不需要调整,也就是此时o1 比 o2大, 不还是降序么。

转载知乎

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PriorityQueue 类是 Java 的一个实现了优先级队列的数据结构,它可以根据元素的优先级自动进行排序。优先级队列的元素按照一定的顺序进行排列,每次从队列取出的元素都是优先级最高(或者最低)的元素。 在 PriorityQueue ,元素的排序可以通过自然排序(自然顺序)或者通过 Comparator 接口来指定。当元素没有实现 Comparable 接口时,需要使用 Comparator 来指定元素的排序规则。 PriorityQueue 使用了堆这种数据结构来实现,堆是一种完全二叉树,具有以下性质: 1. 父节点的值总是大于(或小于)其子节点的值,这取决于所使用的比较器。 2. 完全二叉树的最小(或最大)元素总是在根节点。 PriorityQueue 类提供了一些常用的方法,如插入元素、删除元素、获取队列大小等。你可以使用 add() 或 offer() 方法将元素添加到队列,使用 remove() 或 poll() 方法从队列删除并返回第一个元素,使用 peek() 方法来获取但不删除队列的第一个元素。 下面是一个使用 PriorityQueue 的简单示例: ```java import java.util.PriorityQueue; public class PriorityQueueExample { public static void main(String[] args) { // 创建一个整数类型的优先级队列 PriorityQueue<Integer> pq = new PriorityQueue<>(); // 添加元素到队列 pq.offer(5); pq.offer(2); pq.offer(8); pq.offer(1); // 依次获取并删除队列的元素 while (!pq.isEmpty()) { System.out.println(pq.poll()); } } } ``` 这个示例将输出排序后的整数序列:1、2、5、8。注意,PriorityQueue 默认使用自然排序,即元素的自然顺序。你也可以通过提供自定义的 Comparator 来指定元素的排序规则。 希望这个例子能够帮助你理解 PriorityQueue 类的用法。如有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值