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适用范围更广泛