Java对象的比较_集合框架中PriorityQueue的比较方式

Java对象的比较

之前PriorityQueue 不报错就能offer,是因为Integer自己implements Comparable

4.集合框架中PriorityQueue的比较方式

Java对象的比较_集合框架中PriorityQueue的比较方式_第1张图片
Java对象的比较_集合框架中PriorityQueue的比较方式_第2张图片
Java对象的比较_集合框架中PriorityQueue的比较方式_第3张图片
解决

  • 法一:实现Comparable接口并重写compareTo方法

  • 法二:实现Comparator接口并重写compare方法

//方法1:
class Card implements Comparable<Card>{
     
    public int rank; // 数值
    public String suit; // 花色

    public Card(int rank, String suit) {
     
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
     
        return "Card{" +
                "rank=" + rank +
                ", suit='" + suit + '\'' +
                '}';
    }

    @Override
    public int compareTo(Card o) {
     
        return this.rank-o.rank;//小堆
    }
}
public class TestDemo {
     
    public static void main(String[] args) {
     
        Card card1 = new Card(1,"♦");
        Card card2 = new Card(2,"♦");
        Card card3 = new Card(3,"♦");

        PriorityQueue<Card> qu = new PriorityQueue<>();
        qu.offer(card2);
        qu.offer(card1);
        System.out.println(qu.poll());
        System.out.println(qu.poll());
    }
}

输出:
Card{
     rank=1, suit='♦'}
Card{
     rank=2, suit='♦'}
//方法2.
//!!!!!不实现 Comparable接口,不重写compareTo
//实现Comparator接口并重写compare方法
class Card2 {
     
    public int rank; // 数值
    public String suit; // 花色

    public Card2(int rank, String suit) {
     
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
     
        return "Card{" +
                "rank=" + rank +
                ", suit='" + suit + '\'' +
                '}';
    }

}
public class TestDemo {
     

    /**
     * 测试2.
     * @param args
     */
    public static void main(String[] args) {
     
    	Card2 card1 = new Card2(1,"♦");
        Card2 card2 = new Card2(2,"♦");
        Card2 card3 = new Card2(3,"♦");
		PriorityQueue<Card2> qu2 = new PriorityQueue<>(new Comparator<Card2>() {
     
            @Override
            public int compare(Card2 o1, Card2 o2) {
     
                return o1.rank-o2.rank;//小堆
            }
        });
}
输出:[Card{
     rank=1, suit='♦'}, Card{
     rank=2, suit='♦'}, Card{
     rank=3, suit='♦'}]
//方法2   的另一种写法:
class RankComparator implements Comparator<Card2> {
     

    @Override
    public int compare(Card2 o1, Card2 o2) {
     
        return o1.rank - o2.rank;
    }
}

public class TestDemo {
     

    /**
     * 测试3.
     * @param args
     */
    public static void main(String[] args) {
     
        Card2 card1 = new Card2(1,"♦");
        Card2 card2 = new Card2(2,"♦");
        Card2 card3 = new Card2(3,"♦");
        PriorityQueue<Card2> qu2 = new PriorityQueue<>(new RankComparator());
        qu2.offer(card2);
        qu2.offer(card1);
        qu2.offer(card3);
        System.out.println(qu2);
    }
}


输出:[Card{
     rank=1, suit='♦'}, Card{
     rank=2, suit='♦'}, Card{
     rank=3, suit='♦'}]

你可能感兴趣的:(Java对象的比较_集合框架中PriorityQueue的比较方式)