Java对象的比较
之前PriorityQueue 不报错就能offer,是因为Integer自己implements Comparable
4.集合框架中PriorityQueue的比较方式
解决:
-
法一:实现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='♦'}]