Java关于对象之间大小的比较

Java中的< > <= >=操作符仅适用于数字类型。要比较对象,需使用Comparable接口(实现CompareTo方法)或Comparator接口(实现Compare方法)。Comparable限制了单一比较规则,而Comparator则允许定义多种规则。当不能修改待比较类源码时,Comparator更具灵活性。
摘要由CSDN通过智能技术生成

Java中的 < > <= >= 只能针对数字类型来使用
创建了两个对象来比较对象,就需要用专门的方法来完成:
1.实现Comparable接口,重写其中的Compare To方法(this和o之间的比较)

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

class Card implements Comparable<Card> {
    public String rank;
    public String suit;

    public Card(String rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
    @Override
    public int compareTo(Card o) {
        //this, o
        //this < o, return < 0
        //this > o, return > 0
        //this = o, return 0
        //定义比较规则:扑克牌的点数来进行比较
        int rank1 = this.convertRank();
        int rank2 = o.convertRank();
        //升序排序
        return rank1 - rank2;
       //降序排序
      //return rank2 - rank1;
    }
    private int convertRank() {
    //把String类型的rank转成int值
    //2 - 10 =》2 - 10
    //J => 11 Q => 12 K => 13 A => 14
    if ("A".equals(rank)) {
        return 14;
    }
    if ("K".equals(rank)) {
        return 13;
    }
    if ("Q".equals(rank)) {
        return 12;
    }
    if ("J".equals(rank)) {
        return 11;
    }
    return Integer.parseInt(rank);
}

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

public class TestCompare {
   

    public static void main(String[] args) {
        List<Card> cards = new ArrayList<>();
        cards.add(new Card("A", "红桃"));
        cards.add(new Card("J", "红桃"));
        cards.add(new Card("Q", "红桃"));
        cards.add(new Card("K", "红桃"));
        Collections.sort(cards);
        System.out.println(cards);
    }
}

2.实现Comparator接口,重写其中的Compare方法

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

class Card {
    public String rank;
    public String suit;

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



    public int convertRank() {
        // 把 String 类型的 rank 转成 int 值.
        // 2 - 10 => 2 - 10
        // J => 11
        // Q => 12
        // K => 13
        // A => 14
        if ("A".equals(rank)) {
            return 14;
        }
        if ("J".equals(rank)) {
            return 11;
        }
        if ("Q".equals(rank)) {
            return 12;
        }
        if ("K".equals(rank)) {
            return 13;
        }
        return Integer.parseInt(rank);
    }

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

class CardComparator implements Comparator<Card> {
    @Override
    public int compare(Card o1, Card o2) {
        int rank1 = o1.convertRank();
        int rank2 = o2.convertRank();
        return rank1 - rank2;
    }
}


public class TestCompare2 {
    public static void main(String[] args) {
        List<Card> cards = new ArrayList<>();
        cards.add(new Card("A", "红桃"));
        cards.add(new Card("J", "红桃"));
        cards.add(new Card("K", "红桃"));
        cards.add(new Card("10", "红桃"));
        Collections.sort(cards, new CardComparator());
        System.out.println(cards);
    }

}

以上两个方法的比较:
例如针对Card类来进行比较:
1.对Comparable来说,必须要让Card类来实现Comparable
2.对于Comparator来说,是创建一个新的类(CardComparator),让这个类实现Comparator,然后完成对Card比较
3.Comparable 只能指定一种比较规则,而Comparator可以指定多种比较规则
注:
你想要比较的类可能修改不了(比如类是某个库的类,不是你自己写的类)

最终结论:Comparator比Comparable适用范围更广泛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值